'''
question:
1.单链表反转
2.链表中环的检测
3.两个有序的链表的合并
4.删除链表倒数第n个结点
5.求链表的中间结点
'''
class NEWNODE():
def __init__(self, data:int, next=None):
self.data = data
self._next = next
class SINGLELINKEDLIST():
def __init__(self):
self._head = None
def invert_value_to_top(self, data):
node = NEWNODE(data)
self.invert_node_to_next(node)
def invert_node_to_next(self, new_node: NEWNODE):
if new_node:
new_node._next = self._head
self._head = new_node
def print_all(self):
current = self._head
if current:
print(f"{current.data}", end="")
current = current._next
while current:
print(f"->{ current.data}", end="")
current = current._next
print("\n", flush=True)
def reverse_single_linkedlist(self, single):
reverse_head = None
while single:
middle = single._next
single._next = reverse_head
reverse_head = single
single = middle
return reverse_head
def print_1(l):
l.print_all()
#单链表反转
def reverse_single_linkedlist(single): #单链表反转
if head == None or head._next == None: # 若链表为空或者仅一个数就直接返回
return head
reverse_head = None
while single:
middle = single._next
single._next = reverse_head
reverse_head = single
single = middle
return reverse_head
#检测环
def has_cycle(single):
slow = single
fast = single
while fast and fast._next:
slow = slow._next
fast = fast._next._next
if slow == fast:
return True
return False
#有序链表合并
def merge_sorted_list(l1, l2):
if l1 and l2:
p1 , p2 =l1 , l2
fake_head = Node(Node)
current = fake_head
while p1 and p2:
if p1.data <= p2.data:
current._next = p1.data
p1 = p1._next
else:
current._next = p2.data
p2 = p2._next
current = current._next
current._next = p1 if p1 else p2
return fake_head._next
return l1 or l2
if __name__ == '__main__':
test_text = 'abcdefa'
l = SINGLELINKEDLIST()
for i in test_text:
l.invert_value_to_top(i)
#建立链表
print_1(l)
#测试单链表反转
reverse = l.reverse_single_linkedlist(l._head)
while reverse:
print(reverse.data)
reverse = reverse._next
#检测环
print(has_cycle(l._head))
链表常用操作---学习中
最新推荐文章于 2024-08-05 23:13:57 发布