题目:给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
这题是双指针法的经典应用。
我们首先设置一个虚拟头节点使得头节点一般化,然后设置两个指针fast和slow,然后先让fast移动n+1步,然后再让fast和slow同时移动,当fast移动到NULL时,slow将移动到待删除节点的上一个节点,因此只需要改变slow->next就好。
具体实现代码如下所示:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);//设置一个虚拟头节点
dummyHead->next = head;
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next;
while(fast != NULL) {
fast = fast->next;
slow = slow->next;
}
ListNode* tmp = slow->next;
slow->next = slow->next->next;
delete tmp;
ListNode* result = dummyHead->next;
delete dummyHead;
return result;
}
};
运行结果如下所示: