给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 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]
解题思路
找到倒数第N+1
个元素,将倒数N+1
个元素的next
指向倒数N-1
个元素
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
let r=head;//保存最终结果的指针
let index=0
let temp=null;//记录倒数第N+1个节点的指针
while(head){
index++;
//当前节点
if(index==n+1){//当循环到n+1个元素时,将头指针存储到temp中
temp=r
}else if(index>n+1){//之后每一次迭代都将temp后移一位
temp=temp.next
}
//到下一节点
head=head.next
}
if(index<n){//如果整个链表都没有n个元素那么直接返回整个链表
return r
}else if(index==n){//如果整个链表元素个数正好==n,那么删除头元素就可以了
return r.next
}else{//如果整个链表至少有n+1个元素,那么我们使用我们将前一个指针指向后一个指针的方式来删除倒数第n个元素
temp.next=temp.next.next
return r
}
};
代码解释:
1、函数定义:
removeNthFromEnd
是一个函数,接受两个参数:head
(链表的头节点)和 n
(要删除的节点从末尾开始计数的位置)。
2、初始化指针:
r
指针初始化为head
,它用于跟踪链表的开始,以便在最后返回结果。index
计数器初始化为0
,用于跟踪当前遍历到的节点位置。temp
指针初始化为null
,它用于在遍历过程中跟踪倒数第n+1
个节点的位置。
3、遍历链表:
使用 while
循环遍历链表,条件是 head
不为 null
(即链表未到末尾)。
4、更新索引:
每次循环,index
计数器增加 1
。
5、处理 temp
指针:
- 如果当前索引
index
等于n + 1
,说明当前节点是倒数第n
个节点的前一个节点,此时将temp
指向当前节点(r)
。 - 如果索引
index
大于n + 1
,说明已经过了倒数第n
个节点,此时将temp
向前移动到下一个节点。
6、移动到下一个节点:
将 head
指针移动到下一个节点。
7、边界条件处理:
- 如果
index
小于n
,说明链表中的节点数量小于n
,不需要删除任何节点,返回原始头节点r
。 - 如果
index
等于n
,说明链表中的节点数量正好是n
,需要删除头节点,返回头节点的下一个节点r.next
。
8、删除倒数第 n
个节点:
如果链表至少有 n+1
个节点,通过设置 temp.next = temp.next.next
来删除 temp
指针的下一个节点,即倒数第 n
个节点。
9、返回结果:
返回更新后的链表头节点 r
。