LeetCode第19题删除链表的倒数第N个节点

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

用例:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

记录:

此题我第一眼想到的是遍历一次链表算出长度len然后用长度len减去n即得到了正位序数,且此解法也是官方第一个解法,时间O(n),空间O(1),也不错。但是自己操作的时候多开了一个pre保存遍历链表当前指针的前一个完成删除操作,实际上不用,直接遍历到正位序数前一个就操作即可。

其他还有别的解法如堆栈,遍历链表依次装入栈然后利用栈先进后出的性质按顺序出栈去找n;双指针,维护两个遍历数字,一个i一个j,其中j=i+n,这样一来j遍历到链表末尾再看i就刚好隔了n。

代码(c语言):

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     struct ListNode *next;
 6  * };
 7  */
 8 
 9 
10 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
11     struct ListNode* pre, *now = head;
12     int k = 0;
13     while(now!=NULL){
14         k++;
15         now=now->next;
16     }
17     now = head;
18     n = k-n+1;
19     for(int i = 0; i < n; i++){
20         if(i == n-1){
21             if (i==0){
22                 head = head->next;
23             }
24             else{
25                 pre->next = now->next;
26             }
27         }
28         pre = now;
29         now = now->next;
30     }
31     return head;
32 }

 

posted @ 2021-11-20 11:02  启元  阅读(55)  评论(0)    收藏  举报