19. Remove Nth Node From End of List

leetcode

Posted by chl on May 9, 2019

题目

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不能自己释放,所以没办法只能单独判断这种情况。还有考虑少了删除第一个节点的情况。