题解 | #调整牛群顺序#
调整牛群顺序
https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4?tpId=354&tqId=10591389&ru=/exam/oj/ta&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D354
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
import java.util.*;
// public class ListNode {
// int val;
// ListNode next = null;
// public ListNode(int val) {
// this.val = val;
// }
// }
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
public ListNode moveNthToEnd(ListNode head, int n) {
if (n == 1) {
return head;
}
ListNode preHead = new ListNode(-1);
preHead.next = head;
ListNode fast = preHead;
ListNode slow = preHead;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
ListNode target = slow.next;
slow.next = slow.next.next;
target.next = null;
fast.next = target;
return preHead.next;
}
}
本题知识点分析:
1.快慢指针
2.链表的遍历
3.掌握前驱结点和后继结点如何连接
4.链表结尾要赋值null
本题解题思路分析:
1.使用一个循环将fast指针移动到链表的第n个节点。循环执行n次,每次将fast指针向后移动一个节点。
2.然后,代码使用一个循环同时移动fast和slow指针,直到fast指针达到链表末尾。在每次循环中,fast指针和slow指针都向后移动一个节点。
3.当上述循环结束后,slow指针指向的是待移动节点的前一个节点,即倒数第n+1个节点。代码将变量target指向slow.next,也就是待移动节点。
4.然后,代码修改指针的指向,将slow节点的next指针指向slow.next.next,即跳过待移动节点。然后将target节点的next指针设为null,断开与链表的连接。
5.最后,将target节点插入到fast指针所在位置之后,完成倒数第n个节点的移动。
6.最后,代码返回伪头节点的next指针,即修改后的链表的头节点。
画图基本就能做出来了,建议链表都画图,看图翻译代码
本题使用编程语言:Java
高频面试算法题解 文章被收录于专栏
高频面试算法题解,每天一小步,人生一大步,跟着一起刷起来!
