一、题目要求
- 给你一个链表,删除链表的倒数第
n**个结点,并且返回链表的头结点。 [B站地址]
示例1
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:
输入:head = [1], n = 1 输出:[] 示例 3:
输入:head = [1,2], n = 1 输出:[1]
提示:
- 链表中结点的数目为
sz 1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
本题并不难,只是在查找倒数第 n 个节点的基础上加了一个删除操作 解题思路如下:
- 根据题意可得,如果链表只有一个节点,那么此时
n必然等于1,那么删除倒数第一个节点之后的链表为空,所以特判如果链表只有一个节点,直接返回null即可 - 创建虚拟头节点,因为本题删除的节点有可能是头节点,所以创建虚拟头节点可以方便我们的操作,简化处理逻辑
- 定义三个指针
pre指向虚拟头,target、next指向head - 将
next指针向后走n步 pre、target、next一起向后走,直到next指向null,此时target指向倒数第n个节点- 将
pre指针指向元素(也就是target前一个元素)的next指针指向target.next来达到从链表中删除target节点的目的 - 返回虚拟头节点的下一个节点即可
代码如下
var removeNthFromEnd = function(head, n) {
// head是否为空
if(head.next === null) return null;
// 创建虚拟头节点,创建两个指针,一个指向虚拟头pre,一个指向真实头结点target
let vhead = new ListNode(-1,head),pre = vhead,target = head,next = head;
// next向后走n步
while(n){
n--;
next = next.next;
}
// 当next不为空的时候,三个指针一起向后走
while(next){
pre = pre.next;
target = target.next;
next = next.next;
}
// 此时target指向的就是倒数第n个节点
// 通过将pre.next指向target.next的方法从链表中删除target
pre.next = target.next;
return vhead.next;
};
以上我们就完成了删除倒数第N个结点操作
- 如有更好解答,欢迎留言讨论