问题描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
分析:一个指针先走k+1次,然后和另一个kNode指针一起往后走,最后删除kNode.next即可。
注意i:判空(k==链表长度的情况,走k+1次会空指针)
上代码,拿去即可运行:
java
package onlyqi.daydayupgo06.leetcode;
import lombok.AllArgsConstructor;
import lombok.Data;
public class Leetcode19 {
public static void main(String[] args) {
ListNode listNode6 = new ListNode(6, null);
ListNode listNode5 = new ListNode(5, listNode6);
ListNode listNode4 = new ListNode(4, listNode5);
ListNode listNode3 = new ListNode(3, listNode4);
ListNode listNode2 = new ListNode(2, listNode3);
ListNode listNode1 = new ListNode(1, listNode2);
ListNode listNode = removeNthFromEnd(listNode1, 2);
while (listNode != null) {
System.out.print(listNode.val + " ");
listNode = listNode.next;
}
}
//dummy ──┐
// ├─► ListNode(0) ──► next ──► head
//slow ───┘
public static ListNode removeNthFromEnd(ListNode head, int n) {
// 删除头节点必须
ListNode dummy = new ListNode(0, head);
ListNode slow = dummy;
ListNode fast = dummy;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
// 快的下一个节点为null,就已经是走完N个了
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}
@Data
@AllArgsConstructor
static class ListNode {
int val;
ListNode next;
}
}
运行结果:

我要刷300道算法题,第149道 。 尽快刷到200,每天搞一道 。
迷茫不知道学习什么的时候,就写算法吧