19. 删除链表的倒数第 N 个结点

leetcode-19. 删除链表的倒数第 N 个结点

熟悉的双指针,让fastIndex先前进n步,再让两个指针一起前进,直到fastIndex到达最后一个元素。此时,slowIndex所在的位置即为要删除节点的前一个元素,方便删除操作。

本题稍微卡壳的地方在于,要删除的节点是第一个节点的问题,是没法找到要删除的节点的前一个节点的。但是在引入虚拟头节点dummyHead后,问题就解决了。

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
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slowIndex = dummyHead;
ListNode* fastIndex = dummyHead;
for(int i = 0; i < n; i++)
{
fastIndex = fastIndex->next;
}

while(fastIndex->next != NULL)
{
fastIndex = fastIndex->next;
slowIndex = slowIndex->next;
}

ListNode* temp = slowIndex->next;
slowIndex->next = temp->next;
delete temp;

return dummyHead->next;
}
};