19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* temp = head; ListNode* pre = head; ListNode* after = head; if(head->next == NULL) { return NULL; } for(int i = 0;i < n;i++) { pre = pre->next; } if(pre == NULL) { return head->next; } while(pre->next != NULL) { pre = pre->next; after = after->next; } after->next = after->next->next; return head; } };
|
基本思路:就是固定两个指针,然后让pre指针先走n步,然后pre和after同时走,这样当pre到达最后的时候,after就是倒数第n个。
需要考虑的特殊情况:
- 链表长度为1,只能删掉头结点,返回NULL
- 去掉的节点是头结点(即走完n步之后就是NULL),直接返回头结点的next