详解删除链表的倒数第N个结点
给你一个链表,删除链表的倒数第 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; } }
【结果】
下一篇:
会场安排问题(贪心 两种方法)