链表概述 区别:顺序表要求存储空间连续。扩充时动态改变数据区 链表:原有数据区不用改变,虽然空间开销大,但存储灵活 相同点:都是线性表 链表实现方式:数据区+地址区 单向链表:尾节点地址区指向空,第一个节点为头节点 用程序实现链表结构 is_empty()链表是否为空 length()链表长度 travel()遍历整个链表 add(item)链表头部添加元素 append(item)链表尾部添加元素 insert(pos,item)指定位置添加元素 remove(item)删除节点,从列表头开始找,找到的第一个删掉 search(item)查找节点是否存在 python的变量名维护的真实值指向一个地址,所以可以指向任意类型 二、单向链表 1、定义节点 class Node(object): def __init__(self,elem): self.elem=elem self.next=None node=Node(100) 2、定义单链表类 class SingleLinkList(object): def __init__(self,node=None):#构造函数中需要保存头节点的地址 self.__head=node#__代表私有数字属性 def is_empty(self):#对象方法 return self.__head==None def length(self): #列表的长度,返回节点的数目, # 思路:用游标一开始指向_head的值,依次寻找下一个节点的next区域,直到为None有图
cur=self.__head count=0 while cur!=None: count+=1 cur=cur.next return count def travel(self): cur=self.__head while cur!=None: print(cur.elem) cur=cur.next def add(self,item): #思路:需要先将新节点的next域,指向_head所指向的节点,再让_head指向新节点 #在链表头部添加元素 node=Node(item) node.next=self.__head self.__head=node #item接受具体的节点 def append(self,item): #尾插法 node=Node(item) if self.is_empty(): self.__head=node else: cur=self.__head while cur.next!=None: cur=cur.next cur.next=node def insert(self,pos,item): #指定位置添加元素 if pos<=0: self.add(item) elif pos>(self.length()-1): self.append(item) pre=self.__head count=0 while count<(pos-1): count+=1 pre=pre.next #当循环退出后,pre指向pos-1位置开始进行插入操作 node=Node(item) node.next=pre.next pre.next=node def remove(self,item): cur=self.__head pre=None while cur!=None: if cur.elem==item: #先判断此节点是否是头结点 if cur==self.__head: self.__head=cur.next else: pre.next=cur.next break else: pre=cur cur=cur.next def search(self,item): cur=self.__head while cur!=None: if cur.elem==item: return True else: cur=cur.next return False if cur.elem==item: return True else: cur=cur.next node=Node(100) #先创建一个节点 #把节点传进来,意思是新建的单链表的头节点是上面创建的node,更人性化, # 假使用户不使用这个值,想一开始创建空列表,则可以在构造函数中令node=None if __name__=='__main__': ll= SingleLinkList() print(ll.is_empty()) print(ll.length()) ll.append(1) ll.add(8) print(ll.is_empty()) print(ll.length()) ll.travel() ll.insert(-1,9) ll.travel() ll.remove(9) ll.travel() 二、双向链表 头结点无前驱,尾节点无后继 1、定义节点 class Node(object): def __init__(self,item): self.elem=item self.next=None#后继 self.prev=None#前驱 2、定义双链表类 class DoubleLinkList(object): def __init__(self,node=None): self.__head=node def is_empty(self): # 对象方法 return self.__head==None def length(self): #列表的长度,返回节点的数目, # 思路:用游标一开始指向_head的值,依次寻找下一个节点的next区域,直到为None有图 cur=self.__head count=0 while cur!=None: count+=1 cur=cur.next return count def travel(self): cur=self.__head while cur!=None: print(cur.elem) cur=cur.next def add(self,item): #思路:需要先将新节点的next域,指向_head所指向的节点,再让_head指向新节点 #在链表头部添加元素 node=Node(item) node.next=self.__head self.__head=node node.next.prev=node #item接受具体的节点 def append(self,item): #尾插法 node=Node(item) if self.is_empty(): self.__head=node else: cur=self.__head while cur.next!=None: cur=cur.next cur.next=node node.prev=cur def insert(self,pos,item): #指定位置添加元素 if pos<=0: self.add(item) elif pos>(self.length()-1): self.append(item) else: cur=self.__head count=0 while count<pos: count+=1 cur=cur.next #当循环退出后,pre指向pos-1位置开始进行插入操作 node=Node(item) node.next=cur node.prev=cur.prev cur.prev.next=node cur.prev=node def remove(self,item): cur=self.__head while cur!=None: if cur.elem==item: #先判断此节点是否是头结点 if cur==self.__head: self.__head=cur.next if cur.next:#判断链表是否只有一个节点,即cur.next存在 cur.next.prev=None else: cur.prev.next=cur.next if cur.next: cur.next.prev=cur.prev break else: cur=cur.next def search(self,item): cur=self.__head while cur!=None: if cur.elem==item: return True else: cur=cur.next return False if cur.elem==item: return True else: cur=cur.next 三、单向循环链表 class Node(object): def __init__(self,item): self.elem=item self.next=None class SingleLinkList(object): def __init__(self,node=None): self.__head=node if node: node.next=node def is_empty(self): # 对象方法 return self.__head==None def length(self): #列表的长度,返回节点的数目, # 思路:用游标一开始指向_head的值,依次寻找下一个节点的next区域,直到为None有图 cur=self.__head count=1#此时从1开始 while cur.next!=self.__head: count+=1 cur=cur.next return count def travel(self): if self.is_empty(): return cur=self.__head while cur.next!=self.__head: print(cur.elem) cur=cur.next print(cur.elem) def add(self,item): #思路:需要先将新节点的next域,指向_head所指向的节点,再让_head指向新节点 #在链表头部添加元素 node=Node(item) cur=self.__head if self.is_empty(): self.__head=node node.next=node else: while cur.next!=self.__head: cur=cur.next node.next=self.__head self.__head=node cur.next=node #item接受具体的节点 def append(self,item): #尾插法 node=Node(item) if self.is_empty(): self.__head=node node.next=node else: cur=self.__head while cur.next!=self.__head: cur=cur.next node.next=self.__head cur.next=node def insert(self,pos,item): #指定位置添加元素 if pos<=0: self.add(item) elif pos>(self.length()-1): self.append(item) else: cur=self.__head count=0 while count<pos: count+=1 cur=cur.next #当循环退出后,pre指向pos-1位置开始进行插入操作 node=Node(item) node.next=cur node.prev=cur.prev cur.prev.next=node cur.prev=node def remove(self,item): if self.is_empty(): return cur=self.__head pre=None while cur.next!=self.__head: if cur.elem==item: #先判断此节点是否是头结点 if cur==self.__head:#头结点 rear=self.__head while rear.next!=self.__head: rear=rear.next self.__head=cur.next rear.next=self.__head else:#中间节点 pre.next=cur.next return else: pre=cur cur=cur.next #退出循环,cur指向尾节点 if cur.elem==item: if cur==self.__head: #链表只有一个节点 self.__head=None pre.next=cur.next def search(self,item): if self.is_empty(): return False cur=self.__head while cur.next!=self.__head: if cur.elem==item: return True else: cur=cur.next #退出循环,cur指向尾节点 if cur.elem==item: return True return False if cur.elem==item: return True else: cur=cur.next
python第17天链表
最新推荐文章于 2024-07-27 12:20:46 发布