python 单链表查找元素_Python单链表检查闭环和获取中间元素获取倒数n元素

使用快慢指针的思想进行查找即可。

class Node:

def __init__(self, data):

self.data = data

self.next = None

class LinkedList():

def __init__(self):

self.head: Node = None

def printll(self):

node = self.head

while node:

print(node.data, end=' ')

node = node.next

print()

def append(self, new_node):

node = self.head

if node is None:

self.head = new_node

return

while node.next is not None:

node = node.next

node.next = new_node

def get_backward_node(self, n=2):

if self.head is None:

raise ValueError('Linked list empty!')

fast = self.head

for _ in range(n-1):

if fast.next is not None:

fast = fast.next

else:

raise ValueError('size of n too big!')

slow = self.head

while fast.next is not None:

slow = slow.next

fast = fast.next

print('get_backward_node:', slow.data)

return slow

def get_middle(self):

if self.head is None:

raise ValueError('Linked list empty!')

slow = self.head

fast = self.head

while fast != None and fast.next != None:

fast = fast.next.next

slow = slow.next

print(slow.data)

def has_loop(self):

if self.head is None:

raise ValueError('Linked list empty!')

slow = self.head

fast = self.head.next

while slow != None and fast != None and fast.next != None:

print('fast: ', fast.data, 'slow: ', slow.data)

if fast is slow or fast.next is slow:

print('存在闭环')

return True

fast = fast.next.next

slow = slow.next

print('不是循环列表')

return False

# 合并两个有序列表

def loop_merge_sort(l1, l2):

tmp = []

while len(l1) > 0 and len(l2) > 0:

if l1[0] < l2[0]:

tmp.append(l1[0])

del l1[0]

else:

tmp.append(l2[0])

del l2[0]

print(l1, l2)

tmp.extend(l1)

tmp.extend(l2)

return tmp

if __name__ == "__main__":

node1 = Node(1)

node2 = Node(2)

node3 = Node(3)

node4 = Node(4)

node5 = Node(5)

node6 = Node(6)

node7 = Node(7)

linked = LinkedList()

linked.append(node1)

linked.append(node2)

linked.append(node3)

linked.append(node4)

linked.append(node5)

linked.append(node6)

# linked.append(node2)

linked.append(node7)

if not linked.has_loop():

linked.printll()

linked.get_middle()

linked.get_backward_node(2)

print(loop_merge_sort([1,2,3, 6], [1, 3, 8, 9]))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值