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指针,即修改后的链表的头节点。
画图基本就能做出来了,建议链表都画图,看图翻译代码