刷题Day4|24.两两交换链表节点、19.删除链表倒数低n个节点、160.链表相交、142.环形链表

本文介绍了四种基于链表的编程问题及其解决方案,包括两两交换链表节点、删除链表倒数第n个节点、寻找链表相交节点以及检测环形链表的方法。这些方法主要利用了双指针技术和虚拟头节点的概念。

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
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值