考察的知识点:与链表有关的题基本都是插入,删除,交换顺序等,解决这些问题通常将链表的指针进行修改。
问题分析:首先找出倒数第 n 个结点,使用快慢指针方法,然后这个倒数第 n 个结点可能是头结点,头结点可能是需要改变的,所以有两种思路:第一种,将改变的结点判断一下,若为头结点,则修改头结点的指针,若不是,则正常处理;第二种,构造一个新的头结点,然后再按正常处理就行。
如下为第二种思路,代码如下:
ListNode* moveNthToEnd(ListNode* head, int n)
{
// write code here
if (n == 1)
return head;
ListNode* newhead = new ListNode(-1);
newhead->next = head;
ListNode* cur = newhead;
ListNode* prev = newhead, * end = newhead; //prev指向的是交换结点的前一个指针
//寻找倒数第k个结点使用快慢指针方法,这里end相当于快指针,prev是慢指针
for (int i = 0; i < n; ++i)
{
end = end->next;
}
while (end->next)
{
prev = prev->next;
end = end->next;
}
//end指向最后一个结点
cur = prev->next;
prev->next = cur->next;
end->next = cur;
cur->next = nullptr;
head = newhead->next; //头结点可能被改变,所以更新头结点
delete(newhead);
return head;
}

京公网安备 11010502036488号