https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
双指针
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
思路是这样的,但要注意一些细节。
分为如下几步:
先让fast先走 n 步, 然后fast和slow再一起每次走一步
这样当fast到结尾就是这样
slow指针就是我们要删除的节点,但是我们要找到的是此刻slow指针的上一个节点,才方便删除,因此,流程应该是这样, 先让fast走n + 1步,然后fast和slow再每次走一步,直到fast遇到null, 这样到最后,slow指针就指的是要删除节点的上一个节点了,删除就很方便
、
、
public ListNode removeNthFromEnd(ListNode head, int n) {ListNode newHead = new ListNode(0, head);// 虚拟头节点ListNode fast = newHead;ListNode slow = newHead;// 让fast先走n步while (n-- > 0) {fast = fast.next;}fast = fast.next; // fast还要再走1步, 因为需要让slow指向删除节点的上一个节点while (fast != null) {fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return newHead.next;}public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}
