删除的前提是,确定节点位置。
- 找到倒数第n个节点
- 采用双指针的方式
- 快指针先前进n个节点,然后慢指针从头开始,二者并行,直至快指针到达链表尾部
- 此时,慢指针指向的,就是倒数第n个节点
- 删除倒数第n个节点
- 确定倒数第n+1个节点,即待删除节点node的前驱节点pre
- 设置pre.next = node.next,即前驱节点的next更新为待删除节点的next
综合以上,需要三个指针,一个快指针,一个待删除节点指针,一个前驱节点指针。同时,为了统一删除步骤,减少对特殊情况的排除(如,待删除节点是当前头节点),这里预先设置一个虚拟头节点preHead,使前驱节点指向preHead。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
public ListNode removeNthFromEnd (ListNode head, int n) {
// write code here
if (head == null) {
return head;
}
if (head.next == null && n == 1) {
return null;
}
ListNode preHead = new ListNode(0);
preHead.next = head;
ListNode fast = head, node = head, pre = preHead;
// 到正序第n个
while (--n > 0) {
fast = fast.next;
}
// System.out.println(fast.val);
while (fast != null) {
if (fast.next == null) {
pre.next = node.next;
// fast = fast.next;
break;
} else {
fast = fast.next;
pre = node;
node = node.next;
}
}
return preHead.next;
}
}

京公网安备 11010502036488号