力扣 - 19. 删除链表的倒数第N个节点
题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路1
- 创建哑结点,比较好控制如果就一个元素的情况
- 获取总长度,总长度减去n就是我们链表整数的那个结点的后一个要删除
代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//创建哑结点
ListNode dummy = new ListNode(0);
//将哑结点和链表连接起来
dummy.next = head;
ListNode cur = dummy;
ListNode p = head;
//计算链表的总长度
int len = 0;
while (p != null) {
p = p.next;
len++;
}
//正向移动n即可到达要删除的结点的前一个结点
n = len - n;
for (int i = 0; i < n; i++) {
cur = cur.next;
}
//删除结点
cur.next = cur.next.next;
return dummy.next;
}
}
思路2
- 利用双指针来进行
- 创建一个哑结点作为头部,这样子如果链表就一个元素也就比较好删除
- fast指针为null就是到达链表末尾
- 要删除的结点为n,由于我们获取的是前一个结点,然后通过
slow.next = slow.next.next这样来删除结点的,因此slow和fast的间隔要比n大一个,即i < n + 1
- 要删除的结点为n,由于我们获取的是前一个结点,然后通过
代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//哑结点
ListNode dummy = new ListNode(0);
//哑结点和链表连接起来
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
//将fast后移n+1位
for (int i = 0; i < n + 1; i++) {
fast = fast.next;
}
//判断fast是否到达最后一个元素的后面,即null,如果就一个元素,直接不进入循环
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
//删除结点
slow.next = slow.next.next;
return dummy.next;
}
}
我走得很慢,但我从不后退!

浙公网安备 33010602011771号