19. 删除链表的倒数第 N 个结点

96 阅读1分钟

题目:
给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。

解法: 注意边界条件,删除的是队首,队尾元素,删除的位置<0
方法一:栈

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    // 删除头结点
    // 删除非头结点
    arr := make([]*ListNode, 0)
    cnt := 0
    node := head
    for node != nil {
        cnt ++
        arr = append(arr, node)
        node = node.Next
    }

    if n > cnt {
        return head
    } else if n == cnt {
        return head.Next
    } else {
        indexBeforeDelete := cnt - n -1
        if indexBeforeDelete >= 0 {
            arr[indexBeforeDelete].Next = arr[indexBeforeDelete].Next.Next
        } else {
            return nil
        }
        
        return head
    }
    return nil
}

方法二:双指针

func removeNthFromEnd(head *ListNode, n int) *ListNode {
   node := head
   dummy := &ListNode{0,head}
   l, r := dummy, node
   for i := 0; i < n; i ++ {
       if r == nil {
           break
       }
       r = r.Next
   }
   for ; r != nil; r = r.Next {
       l = l.Next
   }
    l.Next = l.Next.Next
    return dummy.Next
}