题解 | #调整牛群顺序#
调整牛群顺序
https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4
知识点:
链表/寻找倒数第n个节点
分析:
首先找出倒数第 n 个结点,使用快慢指针方法。
由于我们需要找到倒数第 n个节点,因此我们可以使用两个指针同时对链表进行遍历,并且end比 prev超前 n个节点。当 end遍历到链表的末尾时,prev就恰好处于倒数第 n个节点。
具体地,初始时 end和 prev均指向头节点。我们首先使用 end对链表进行遍历,遍历的次数为 n。此时,end和prev之间间隔了 n−1 个节点,即end比prev超前了 n个节点。
在这之后,我们同时使用end和prev对链表进行遍历。当 end 遍历到链表的末尾(即 end为空指针)时,prev恰好指向倒数第 n个节点。
编程语言:
C++
完整代码:
ListNode* moveNthToEnd(ListNode* head, int n) { // write code here if (n == 1) return head; ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* cur = head; ListNode* prev = dummy, * end = dummy; for (int i = 0; i < n; ++i) { end = end->next; } while (end->next) { prev = prev->next; end = end->next; } cur = prev->next; prev->next = cur->next; end->next = cur; cur->next = nullptr; return dummy->next; }