大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目主要考察链表的遍历、指针操作以及链表节点的删除和插入操作。
题目解答方法的文字分析
题目要求将链表中的倒数第 n 个节点移到链表的末尾。我们可以通过使用两个指针来实现这个目标。首先,一个指针先移动 n 步,然后两个指针同时向后移动,直到第一个指针到达链表的末尾。此时,第二个指针指向的节点就是倒数第 n 个节点,我们将它从链表中删除,并将它插入到链表的末尾。
举个例子,假设链表为 1 -> 2 -> 3 -> 4 -> 5,n = 2。首先,第一个指针移动 2 步,指向节点 3,然后两个指针同时向后移动,直到第一个指针指向节点 5。此时,第二个指针指向节点 4,我们将节点 4 从链表中删除,并将它插入到节点 5 后面,得到新的链表 1 -> 2 -> 3 -> 5 -> 4。
本题解析所用的编程语言
C++
完整且正确的编程代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* moveNthToEnd(ListNode* head, int n) {
if (head == nullptr || n <= 0) {
return head;
}
ListNode* dummy = new ListNode(0); // 添加一个哑节点简化操作
dummy->next = head;
ListNode* slow = dummy;
ListNode* fast = dummy;
// 第一个指针先移动 n 步
for (int i = 0; i <= n; ++i) {
if (fast == nullptr) {
return head; // 链表长度小于 n,直接返回原链表
}
fast = fast->next;
}
// 同时移动两个指针,直到第一个指针到达链表末尾
while (fast != nullptr) {
slow = slow->next;
fast = fast->next;
}
// 此时第二个指针指向倒数第 n 个节点,将其从链表中删除
ListNode* nthNode = slow->next;
slow->next = nthNode->next;
// 将倒数第 n 个节点插入到链表末尾
ListNode* current = dummy;
while (current->next != nullptr) {
current = current->next;
}
current->next = nthNode;
nthNode->next = nullptr;
ListNode* newHead = dummy->next;
delete dummy; // 释放哑节点内存
return newHead;
}
};
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q ](https://www.nowcoder.com/users/231521985) !

京公网安备 11010502036488号