876链表的中间结点,19删除链表的倒数第N个节点
链表的中间结点
用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func middleNode(head *ListNode) *ListNode {
var slow,fast *ListNode = head,head
for fast!=nil&&fast.Next!=nil {
slow=slow.Next
fast=fast.Next.Next
}
return slow
}
删除链表的倒数第N个节点
在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的
next
\textit{next}
next指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。
由于我们需要找到倒数第 n n n个节点,因此我们可以使用两个指针 first \textit{first} first和 second \textit{second} second 同时对链表进行遍历,并且 first \textit{first} first 比 second \textit{second} second超前 n n n个节点。当 first \textit{first} first遍历到链表的末尾时, second \textit{second} second就恰好处于倒数第 n n n个节点。
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummy := &ListNode{0, head}
first, second := head, dummy
for i := 0; i < n; i++ {
first = first.Next
}
for ; first != nil; first = first.Next {
second = second.Next
}
second.Next = second.Next.Next
return dummy.Next
}
作者:LeetCode-Solution
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。