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 }

浙公网安备 33010602011771号