链表集合
剑指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步。接下来两个指针以相同的速度在链表上向前移动,直到它们相遇。它们相遇的结点正好是环的入口结点。
现在,关键问题在于怎么知道环中有几个结点呢?
可以使用快慢指针,一个每次走一步,一个每次走两步。如果两个指针相遇,表明链表中存在环,并且两个指针相遇的结点一定在环中。
随后,我们就从相遇的这个环中结点出发,一边继续向前移动一边计数,当再次回到这个结点时,就可以得到环中结点数目了。
思路2:
1遍历这个链表,把链表每个元素记录在list里,然后一旦遇到了重复节点则存在环,不然就不存在
剑指offer 删除链表中重复的结点
判断当前节点和下一个节点之间关系
不相等,则直接加入新的链表节点中;
相等,则一直找到不等的节点,重新开启上面的判断逻辑
(仅学习笔记)