反转
遍历
找中间节点
大文件(GB级别)搜索、查找及优化查找速度的方法
目录
1. 判断单链表有环
构造链表
设定快慢两个指针
慢指针=快指针返回true
class LNode:
def __init__(self, elem):
self.elem = elem
self.pnext = None
def exitLoop(LList):
p1 = p2 = LList
while p2 and p2.pnext: #当链表为空或者只有一个结点时,就不执行循环体里的程序,返回False
p1 = p1.pnext
p2 = p2.pnext.pnext
if p1 == p2:
return True
return False
if __name__=="__main__":
LList = LNode(1)
p1 = LNode(2)
p2 = LNode(3)
p3 = LNode(4)
p4 = LNode(5)
p5 = LNode(6)
LList.pnext = p1
p1.pnext = p2
p2.pnext = p3
p3.pnext = p4
p4.pnext = p5
p5.pnext = p2
print(exitLoop(LList))
2. 统计有环单链表结点个数
https://blog.csdn.net/nwpulei/article/details/8126359
3. 单链表反转
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def reverse_linkedlist(head):
if head is None or head.next is None:
return head
else:
new_head = reverse_linkedlist(head.next) # 指针迭代到底,new_head指向链表最后一个结点,做为新链表头。此时head指向原链表最后一个结点的前一个结点。然后从原链表最后面的两个结点开始反转,依次向前
head.next.next = head # head指向原链表倒数第二个,head.next指向倒数第一个(也就是new_head),这句目的是让new_head的next指向原链表的倒数第二个,即实现了一次反转
head.next = None # 反转一次之后,将原链表中前一个结点(如倒数第二个)指向后一个结点(如倒数第一个)的指向关系断开,防止形成环
return new_head
head = ListNode(1) #测试代码
p1 = ListNode(2) # 建立链表1->2->3->4->None
p2 = ListNode(3)
p3 = ListNode(4)
head.next = p1
p1.next = p2
p2.next = p3
new_head = None
p = reverse_linkedlist(head) #输出链表4->3->2->1->None
while p:
print(p.val, end=' ') # end参数让多个print显示在同一行,空格分隔
p = p.next