【题目】
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
【思路】
设置两个指针,一个指针正常遍历,一个指针延后遍历。在往后遍历的时候,对n进行减法运算,一旦n为0后开始移动,延后指针开始移动
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* ptr = head; 12 struct ListNode* delayN = head; 13 while(ptr->next != NULL){ 14 if (n > 0) 15 n--; 16 else 17 delayN = delayN->next; 18 ptr = ptr->next; 19 } 20 if(n == 0) 21 delayN->next = delayN->next->next; 22 else 23 head = head->next; 24 return head; 25 }
【BUG分析】
一开始没有line22 line23,对[1] 1出现错误。此时n没有进行减法运算,不为0,因此就是去掉头结点!!!
【结果】
0ms 100%
5.4MB 100%
不过没有free这是个问题QWQ
如果严谨一点……就不是双百了QAQ
1 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){ 2 struct ListNode* ptr = head; 3 struct ListNode* delayN = head; 4 while(ptr->next != NULL){ 5 if (n > 0) 6 n--; 7 else 8 delayN = delayN->next; 9 ptr = ptr->next; 10 } 11 if(n == 0){ 12 struct ListNode* s = delayN->next; 13 delayN->next = delayN->next->next; 14 free(s); 15 } 16 else { 17 struct ListNode* s = head; 18 head = head->next; 19 free(s); 20 } 21 return head; 22 }
【结果】
4ms 73.58%
5.6MB 100%