给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例1:

结果如下

【第一步】加入虚拟头结点,然后定义快慢指针指向虚拟头结点

【第二步】让fast指针移动n步(n=2)

【第三步】移动fast指针和slow指针,直到fast.next == null,此时slow指针就指向了待删除结点的前驱节点。

【第四步】利用slow.next = slow.next.next 就可以对节点进行删除。

【代码如下】
- package link;
-
- import static link.ListNode.print;
-
- public class RemoveNthFromEnd {
- public static void main(String[] args) {
- ListNode node1 = new ListNode(1);
- ListNode node2 = new ListNode(2);
- ListNode node3 = new ListNode(3);
- ListNode node4 = new ListNode(4);
- ListNode node5 = new ListNode(5);
- node1.next = node2;
- node2.next = node3;
- node3.next = node4;
- node4.next = node5;
- System.out.println("=========交换前=========");
- print(node1);
- ListNode node = removeNthFromEnd(node1,2);
- System.out.println("=========交换后=========");
- print(node);
- }
-
- public static ListNode removeNthFromEnd(ListNode head, int n) {
- // 最好要先获得链表的长度,如果删除的n > size 会出现空指针异常
-
- // 设置虚拟头结点方便删除 第一个节点。
- ListNode dummy = new ListNode();
- dummy.next = head;
- // 设置快慢指针
- ListNode fast = dummy;
- ListNode slow = dummy;
- // 先移动fast指针,让fast指针与slow指针相差n个节点。
- while (n-- > 0) {
- fast = fast.next;
- }
- // 找到待删除节点的前驱节点slow
- while (fast.next != null) {
- fast = fast.next;
- slow = slow.next;
- }
- // 此时slow 指向待删除的节点的前驱节点
- slow.next = slow.next.next;
- return dummy.next;
- }
- }
【结果】
