LeetCode 24. 两两交换链表中的结点
思路:用虚拟节点遍历,保存虚拟节点的后三个结点,进行处理。
func swapPairs(head *ListNode) *ListNode {
dummy := &ListNode{0, head}
cur := dummy
for cur.Next != nil && cur.Next.Next != nil{
next1 := cur.Next
next2 := next1.Next
cur.Next = next2
next3 := next2.Next
next2.Next = next1
next1.Next = next3
cur = next1
}
return dummy.Next
}
LeetCode 19. 删除链表的倒数第N个结点
思路:算出链表的长度,倒数第N个也就是正数第len - N个
func getlen(head *ListNode)int{
n := 0
for head != nil{
head = head.Next
n++
}
return n
}
func removeNthFromEnd(head *ListNode, n int) *ListNode {
len := getlen(head)
dummy := &ListNode{0, head}
cur := dummy
for i := 0; i < len - n; i++{
cur = cur.Next
}
cur.Next = cur.Next.Next
return dummy.Next
}
LeetCode 面试题 02.07.链表相交
思路:两个链表指针一直走,如果一个走到nil,就从另一个链表的开头走,终会相遇。
func getIntersectionNode(headA, headB *ListNode) *ListNode {
if headA == nil || headB == nil{
return nil
}
h1 := headA
h2 := headB
for h1 != h2{
if h1 == nil{
h1 = headB
}else{
h1 = h1.Next
}
if h2 == nil{
h2 = headA
}else{
h2 = h2.Next
}
}
return h1
}
LeetCode 142. 环形链表Ⅱ
func detectCycle(head *ListNode) *ListNode {
slow, fast := head, head
for fast != nil && fast.Next != nil{
fast = fast.Next.Next
slow = slow.Next
if fast == slow{
start := head
for start != slow{
start = start.Next
slow = slow.Next
}
return start
}
}
return nil
}