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