题目考查的知识点
题目解答方法的文字解析
- 初始化快慢指针,使用一个虚拟节点作为头节点(以便应对 n等于链表长度的情况)
- 快指针先走n步
- 快慢指针同时走,直到快指针指向最后一个节点
- 这时候,慢指针的next指向了倒数第n个节点
- 断链,因为要将该节点移动到链表尾部,所以该节点的next是需要置空
本题解析所用的编程语言
完整且正确的编程代码
class Solution {
public:
ListNode* moveNthToEnd(ListNode* head, int n) {
// 特判n=1的情况
if(n==1)return head;
// 1. 初始化快慢指针
ListNode dummyHead = ListNode(-1);
dummyHead.next = head;
ListNode*fast=&dummyHead, *slow=&dummyHead;
// 2. 快指针先走n步
for(int i=1; i<=n; ++i)fast = fast->next;
// 3. 快慢指针同时走
while(fast&&fast->next){
fast = fast->next;
slow = slow->next;
}
// 4. 这时候,慢指针的next指向了倒数第n个节点
ListNode*node = slow->next;
slow->next = slow->next->next;
fast->next = node;
// 5. 断链
node->next = nullptr;
return dummyHead.next;
}
};