题目描述:
给你一个链表,删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
思路分析:
因为不是双向链表,删除倒数第n个节点不好模拟,所以可以先遍历一趟记录节点的总个数,这样可以把删除导数第n个节点转换成正向的第m个,方便我们循环删除
代码实现:
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummy:=&ListNode{-1,nil}//生成一个虚拟节点
dummy.Next=head
temp:=dummy.Next
if temp==nil{
//头节点为空,即链表为空,直接返回
return head
}
cnt:=1//用来记录节点总个数
for temp.Next!=nil{
cnt+=1
temp=temp.Next
}//循环结束后temp指向最后一个节点,并且cnt表示节点的个数
count:=cnt+1-n//删除到处第n个元素,就是删除正数第count个
if count<1{//肯定有错误,比如总共只有五个元素,你说要删除倒数第八个,这是不合理的
return nil
}
temp1:=dummy
for temp1.Next!=nil&&count>1{
temp1=temp1.Next
count--
}
temp1.Next=temp1.Next.Next
return dummy.Next//这里不能直接返回head,而要返回dummy.Next,考虑场景:链表只有一个节点并且删除第一个元素的时候
}