题目
Given a linked list, remove the n-th node from the end of list and return its head.
题意
删除链表倒数第n个节点,返回头节点
题解
寻找倒数第n个节点,就是使用快慢两个指针,快的先走n-1步,然后再走慢的,这样快的到尾节点时慢节点所在位置就是倒数第n个了。
而这里需要删除某个节点,所以需要在设置一个前驱节点,这样才能执行删除操作。
代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
if head==nil{
return head
}
fast,slow,pre := head,head,head
count := n-1
for count!=0 && fast!=nil{
fast = fast.Next
count--
}
//倒数个数错误
if fast==nil{
return head
}
for fast.Next!=nil{
fast=fast.Next
pre = slow
slow = slow.Next
}
//只有一个元素并且要删除自身的情况,因为go中不能直接释放某个节点的内存,所以最后返回head时还是会返回该节点
if head.Next==nil{
return nil
}
//删除第一个的情况
if slow==head{
return slow.Next
}
pre.Next = slow.Next
slow.Next = nil
slow=nil
return head
}
总结
因为遇到过挺多次了,思路也比较清晰,就是考虑少了几种情况。原本删除只有一个节点的链表时,在释放某个节点的内存的时候再返回head应该是没错的,但是go不能自己释放,所以没办法只能单独判断这种情况。还有考虑少了删除第一个节点的情况。