剑指offer(链表集合)-小白刷题笔记

链表集合

剑指offer3:从尾到头打印链表

思路:使用一个栈来解决,从头到尾遍历链表放入栈中, 根据栈先入后出的性质, 可以实现将链表从尾到头返回.python可以直接使用列表的插入方法,每次插入数据,只插入在首位。
在这里插入图片描述

剑指offer: 链表中倒数第k个节点

思路:使用两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;从第k部开始, 第二个指针也开始从链表的头指针开始遍历。 由于两个指针的距离保持在k-1, 当第一个指针到达链表结尾时候, 第二个指针正好是倒数第k个节点.
在这里插入图片描述
在这里插入图片描述

剑指offer 反转链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

剑指offer 合并两个排序的列表

思路:

先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现.


class Solution:
	def Merge(self, phead1, phead2):

        # write code here

​        if phead1 == None:
​            return phead2
​        if phead2 == None:
​            return phead1
​        newhead = phead1 if phead1.val < phead2.val else phead2  # 新的链表的头选择phewad1还是phead2进行判断
​        ptmp1 = phead1
​        ptmp2 = phead2
​        if newhead == ptmp1:
​            ptmp1 = ptmp1.next
​        else:
​            ptmp2 = ptmp2.next

        previous = newhead   # 初始的指
    while ptmp1 and ptmp2:
        if ptmp1.val < ptmp2.val:
            previous.next = ptmp1
            previous = ptmp1
            ptmp1 = ptmp1.next
        else:
            previous.next = ptmp2
            previous = ptmp2
            ptmp2 = ptmp2.next

    if ptmp1 == None:
        previous.next = ptmp2
    else:
        previous.next = ptmp1
    return newhead

在这里插入图片描述


剑指offer 复杂链表的复制


```python
class Solution:
    # 返回 RandomListNode
    def Clone(self, phead):
        # write code here
        #  复制一个一样的Node,并且加到之前的列表的每一个node 
        if phead is None:
            return None 
        ptmp = phead 
        while ptmp:
            node = RandomListNode(ptmp.label)
            node.next = ptmp.next 
            ptmp.next = node 
            ptmp = node.next 
        # 实现新的node的random的指向
        ptmp = phead 
        while ptmp:
            if ptmp.random:
                ptmp.next.random = ptmp.random.next 
            ptmp = ptmp.next.next 
            
        ptmp = phead 
        newhead = phead.next 
        pnewtmp = phead.next
        while ptmp:
            ptmp.next = ptmp.next.next 
            if pnewtmp.next:
                pnewtmp.next = pnewtmp.next.next 
                pnewtmp = pnewtmp.next
            ptmp = ptmp.next 
        return newhead 

剑指offer 两个链表的第一个公共节点

思路: 把两个链表拼接起来, 一个phead1 在phead2在后, 一个phead2在前phead1在后。这样生成了两个相同长度的链表,那么我们只要同事遍历这两个表, 就一定能找到公共结点。

在这里插入图片描述

剑指offer 链表中环的入口结点

思路1:

可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中的环有n个结点,指针P1先在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向的入口结点时,第一个指针已经围绕着揍了一圈又回到了入口结点。

以下图为例,指针P1和P2在初始化时都指向链表的头结点。由于环中有4个结点,指针P1先在链表上向前移动4步。接下来两个指针以相同的速度在链表上向前移动,直到它们相遇。它们相遇的结点正好是环的入口结点。

img

现在,关键问题在于怎么知道环中有几个结点呢?

可以使用快慢指针,一个每次走一步,一个每次走两步。如果两个指针相遇,表明链表中存在环,并且两个指针相遇的结点一定在环中。

随后,我们就从相遇的这个环中结点出发,一边继续向前移动一边计数,当再次回到这个结点时,就可以得到环中结点数目了。

思路2:

1遍历这个链表,把链表每个元素记录在list里,然后一旦遇到了重复节点则存在环,不然就不存在

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0inj450R-1594348387525)(/home/wenda/.config/Typora/typora-user-images/image-20200710091603429.png)]

剑指offer 删除链表中重复的结点

判断当前节点和下一个节点之间关系
不相等,则直接加入新的链表节点中;
相等,则一直找到不等的节点,重新开启上面的判断逻辑
在这里插入图片描述
(仅学习笔记)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值