简介
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
解决方式:链表 + 双指针
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
推荐看自在飞花(141)、灵茶山艾府大佬的讲解。
双指针
解题思路:此题略有不同,由于可能存在链表头节点就是倒数第 n 个节点的情况,所以我们需要在双指针的基础上在创建一个伪头节点,方便后续可能删除头节点。再者,此题双指针并不是一般上的一块一慢,而是固定一个长度。这样迭代到终止条件时,后节点就可以指向倒数第 n 个节点或者倒数第 n 个节点的上一个节点。
java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 伪头节点,解决删除链表头节点的情况
ListNode t = new ListNode(0,head);
ListNode pre = t;
ListNode cur = t;
// 前驱节点往后移动 n 次
while(n-- > 0){
pre = pre.next;
}
// 两节点保持相同的距离向后移动
while(pre.next != null){
// 防止后节点直接指向倒数第 n 个节点
// 若想直接指向倒数第 n 个节点,可以 pre != null。
pre = pre.next;
cur = cur.next;
}
// 此时,后节点指向倒数第 n 个节点的前一个节点
// 移除倒数第 n 个节点
cur.next = cur.next.next;
// 返回结果
return t.next;
}
}