19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
利用双指针,为了找到倒数第n个结点,可以将快慢指针之间的保持存在n个结点,这样当快指针指向最后一个结点的空指针域时,慢指针指向的结点的next域就是待删除结点。因此关键就是让快指针比慢指针先移动n+1步(两个指针之间存在n个结点,说明其之间有n+1个next指针),然后同步移动直到快指针为空。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyhead = new ListNode(-1);dummyhead->next = head;ListNode* fast = dummyhead;ListNode* slow = dummyhead;n++;//fast先移动n+1步while(n--){fast = fast->next;}while(fast != nullptr){fast = fast->next;slow = slow->next;}ListNode* tmp = slow->next;slow->next = slow->next->next;delete tmp;ListNode* newhead = dummyhead->next;delete dummyhead;//删除虚拟头节点return newhead;}
};