class Node: """链表的节点的结构""" def __init__(self,data): self.data=data #数据 self.next=None #下一个结点指针 return def has_value(self,value): """判断节点值是否为参数value""" if self.data==value: return True else: return False class singlelink: """单链表数据结构""" def __init__(self): self.head=None #头节点 self.tail=None #尾节点 self.length=0 #链表长度 return def isempty(self): """判断链表是否为空链表""" return self.length==0 def add_node(self,item): """链表尾部添加节点""" if not isinstance(item,Node): #如果参数不是节点类型 item=Node(item) #创建节点 if self.head is None: #如果头节点为空,直接让头指向新节点 self.head=item self.tail=item else: self.tail.next=item #尾部添加 self.tail=item self.length+=1 return def insert_node(self,index,data): """链表插入节点,参数为:index位置,data数据""" if self.isempty(): #链表若空 print("link is empty,operation failed.") return if index<0 or index>=self.length: #索引若越界 print("error.out of index.") item=Node(data) #建立新节点 if index==0: #头部插入 item.next=self.head #新节点next指向头 self.head=item #更新头为新节点 self.length+=1 #链表长度加1 return j=0 curr=self.head #当前指针 pre=self.head #当前指针的前一位 while curr.next and j<index: #非尾结点且未找到要插入位置index pre=curr curr=curr.next #更新指针为下一位 j+=1 if j==index: #找到对应的位置,此时curr指针在目标位置 #item.next=curr #pre.next=item pre.next=item item.next=curr #思考两者顺序是否能颠倒---可以 self.length+=1 def delete_node_byid(self,item_id): """按给出的id值,删除某节点""" id=1 curr=self.head pre=self.head while curr is not None: if id==item_id: #找到了要删除的节点位置 if pre is not None: pre.next=curr.next else: #pre不存在,小于两个节点的情况 self.head=curr.next return pre=curr curr=curr.next id+=1 self.length-=1 #长度减一 return def find_node(self,value): """找出链表中是否存在value值,打印其位置(非索引)""" curr=self.head id=1 result=[] while curr is not None: if curr.has_value(value): result.append(id) #如果有value,位置加入结果集 curr=curr.next id+=1 return result def print_link(self): """遍历打印链表值""" curr=self.head while curr is not None: print(curr.data) curr=curr.next return Node1=Node(1) Node2=Node(2) Node3=Node(3) Node4=Node(4) Node5=Node(5) link=singlelink() for node in[Node1,Node2,Node3,Node4,Node5]: link.add_node(node) link.print_link() print('-'*20) link.delete_node_byid(2) link.print_link() print('-'*20) link.insert_node(2,100) link.print_link() print('-'*20) link.insert_node(0,100) link.print_link() print('-'*20) print(link.find_node(100))