题目:
给你一个链表,删除链表的倒数第 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
}