判断单链表是否有环
class Node():
def __init__(self,item=None):
self.item = item
self.next = None
def find(head):
low,fast = head,head
while fast.next!=None and fast.next.next!=None:
low = low.next
fast = fast.next.next
if low==fast:
return True
# break
return False
if __name__ == "__main__":
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node2
# node5.next = None #如果使用这个,就没有环了,return的是False
print(find(node1))
创建链表,并实现链表插入操作(不常用,可跳过)
class Node():
def __init__(self,item=None):
self.item = item
self.next = None
#插入操作
def insert(head,tmp,node):
tmp.next = node.next
node.next = tmp
return head
if __name__ == "__main__":
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node1.next = node2
node2.next = node3
node3.next = None
tmp = Node(8)
tmp.node = None
insert(node1,tmp,node2) #将tmp插入node2后面
print(node2.next.item) # 8
print(tmp.next) #<__main__.Node object at 0x7f3eafe784e0>
print(node3) #<__main__.Node object at 0x7f3eafe784e0>
从输出可以看出,node2后面的节点变成了tmp(值为8),tmp后面是node3。
【总结】:但是从上面这个例子可以看出,节点是一个一个定义的,十分麻烦,而且插入节点也是定义好了的,实际上在使用的时候,节点的定义是在函数内部完成的,而且对链表进行插入操作时,只会告诉要插入的值以及插入位置的索引,不会告诉插入节点和被插入节点,因此实际使用中,一般采用下面的方法。
python创建有向单链表,并实现基本功能
https://blog.csdn.net/weixin_39881922/article/details/80470896
单链表的基本操作包括:
is_empty() 链表是否为空
length() 链表长度
travel() 遍历整个链表
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
search(item) 查找节点是否存在
下面是实现:
class Node():
def __init__(self,val=None):
self.data = val
self.next = None
class LinkList():
def __init__(self,node=None):
self.head=node
#初始化链表
def initlist(self,data):
self.head = Node(data[0])
p = self.head
for i in data[1:]:
node = Node(i)
p.next = node
p = p.next
# 判断链表是否为空
def is_empty(self):
return True if self.head is None else False
#获取链表长度
def length(self):
p = self.head
count=0
while(p!=None):
count+=1
p = p.next
return count
#获取索引index的val
def getitem(self,index):
j = 0
p = self.head
while(j!=index and p.next!=None):
p = p.next
j+=1
if j==index:
return p.data
#遍历整个链表
def travel(self):
p = self.head
res = []
while(p!=None):
res.append(p.data)
p = p.next
return res
#链表头部添加元素
def add(self,item):
p = self.head
new_node = Node(item)
new_node.next = p
self.head = new_node
#指定位置添加元素
def insert(self,item,pos):
p = self.head
count = 0
new_node = Node(item)
while count<pos-1:
p = p.next
count+=1
new_node.next = p.next
p.next = new_node
#删除节点
def remove(self,item):
if self.is_empty():
return
pre = None #要删除的节点的前一个节点,我们需要改它的next指向
p = self.head
while(p!=None):
if p.data!=item:
pre = p
p = p.next
else:
if p==self.head: #如果要删除的是头结点
self.head = p.next
break #删完要break,否则进入死循环
else: #删除的不是头节点
pre.next = p.next
break
#查找节点是否存在
def search(self,item):
p = self.head
while(p.next!=None):
if p.data==item:
return True
p = p.next
return False
#删除链表
def delete(self):
p = self.head
while(p!=None):
q = p.next #利用q节点存储p.next,否则p释放后就找不到后半段链表了
self.remove(p.data)
p = q #将q赋给p
if __name__ == "__main__":
l = LinkList()
l.initlist([1,2,3,4,5])
# print(l.getitem(1)) #2
print(l.length()) #5
print(l.travel()) #[1, 2, 3, 4, 5]
l.add(10)
print(l.travel()) #[10, 1, 2, 3, 4, 5]
l.insert(100,3)
print(l.travel()) #[10, 1, 2, 100, 3, 4, 5]
print(l.search(4)) #True
l.remove(100)
print(l.travel()) #[10, 1, 2, 3, 4, 5]
l.delete()
print(l.travel()) #[]