24.两两交换链表节点
两两交换链表
这道题需要用到虚拟头节点来进行定位,返回的时候好返回修改后的首节点。

func swapPairs(head *ListNode) *ListNode {
tmp := &ListNode{0,head}
ret := tmp
for tmp.Next != nil && tmp.Next.Next != nil{
node1 := tmp.Next
node2 := tmp.Next.Next
tmp.Next = node2
node1.Next = node2.Next
node2.Next = node1
tmp = node1
}
return ret.Next
}
19.删除链表倒数低n个节点
删除链表第n个节点
这道题同样可以采用双指针法来解决。快指针先走n个节点,然后再从头节点开始走一个,当快指针走到尾部节点时,刚好是倒数第n个节点。
160.链表相交
链表相交
这道题目主要是采用双指针法,A = a + c、B = b + c,所以当a + c + b = b + c + a,当循环一圈再接上另一个链表时,相同的节点即为第一个相交节点。

需要注意的就是当判断到最后一个节点时需要立马接上,否则就会错开一个节点。
func getIntersectionNode(headA, headB *ListNode) *ListNode {
if headA == nil || headB == nil {
return nil
}
tmp1 := headA
tmp2 := headB
for tmp1 != tmp2 {
if tmp1 == nil {
tmp1 = headB
}else{
tmp1 = tmp1.Next
}
if tmp2 == nil {
tmp2 = headA
}else{
tmp2 = tmp2.Next
}
}
return tmp1
}
142.环形链表
环形链表就是追赶问题,采用快慢指针的方式,当快指针每次走两个单位,慢指针每次走一个单位,则a + b + n(b + c)= 2[a + b],因为设定快慢指针的速度分别为2和1,所以必定在慢指针进入环内一圈之内快指针就会追上(这里需要画图细品),所以可以导出a = (n - 1)(c + b) + c,所以当两个指针(fast、slow)相遇时,再从头节点开始出发一个指针c,当c继续与slow相遇时,即为入环的节点。
func detectCycle(head *ListNode) *ListNode {
fast := head
slow := head
for fast != nil && fast.Next != nil{
slow = slow.Next
fast = fast.Next.Next
if slow == fast{
for slow != head{
slow = slow.Next
head = head.Next
}
return head
}
}
return nil
}
本文介绍了四种基于链表的编程问题及其解决方案,包括两两交换链表节点、删除链表倒数第n个节点、寻找链表相交节点以及检测环形链表的方法。这些方法主要利用了双指针技术和虚拟头节点的概念。



被折叠的 条评论
为什么被折叠?



