【python】关于python的链表结构实现
【参考】
【https://blog.csdn.net/weixin_37728031/article/details/81145258】【注意链表结构,节点包括数值和next、链表中的head】
【https://www.cnblogs.com/yudanqu/p/9172459.html】【链表的类的实现】【* 画一下图有助于理解节点和链表】
【https://www.cnblogs.com/linxiyue/p/3551633.html】【Node和单链表】
【https://blog.csdn.net/su_bao/article/details/81065746】【一些链表的操作】
【https://www.cnblogs.com/yudanqu/p/9172459.html】【链表的构建+链表的实例化(main)】
【实践】
# -*- coding:UTF-8 -*- class Node(): def __init__(self, item): self._item=item self._next=None def getItem(self): return self._item def getNext(self): return self._next def setItem(self, newitem): self._item=newitem def setNext(self, newnext): self._next=newnext class SingleLinkedList(): def __init__(self): self._head=None self._size=0 # 检测链表是否是空的 def isEmpty(self): return self._head==None def size(self): current=self._head count=0 while current!=None: # 这处的判断不可以是current.getNext()!=None 因为最后一个节点虽然指向为None,但他的val值存在,该节点需要计入size长度 count+=1 current=current.getNext() return count def travel(self): current=self._head while current!=None: # 这处的判断不可以是current.getNext()!=None 因为最后一个节点虽然指向为None,但他的val值是需要打印的 print current.getItem(), '=>' # print current.getNext(), '=>' # 打印出来的是内存地址 current=current.getNext() # add方法,在链表前段添加节点元素 def add(self, item): temp=Node(item) temp.setNext(self._head) # self下的是链表当前头节点,temp是要新加的节点;self._head目前指向的是当前节点,并把指向赋给temp的next指针,则temp的next指针指向当前节点; self._head=temp # 把当前链表的head指针指向新的节点,即temp这个点 # append方法,在链表尾部添加节点元素 def append(self, item): temp=Node(item) if self.isEmpty(): self._head=temp # 若链表是空的,则将头节点指向要添加的元素 else: current=self._head # 此刻current是一个具体节点,self指的是链表 while current.getNext()!=None: current=current.getNext() current.setNext(temp) # search方法,用来检测某节点元素是否在链表中 def search(self, item): current=self._head founditem = False while current!=None and not founditem: if current.getItem()==item: founditem=True else: current=current.getNext() return founditem # index方法,用来索引节点元素在链表中的位置 def index(self,item): current=self._head count=0 found=False while current!=None and not found: count+=1 # count+=1 和 count++ 一致性 if current.getItem()==item: found=True else: current=current.getNext() if found: return count else: raise ValueError, '%d is not in linkedlist' %item # raise方法的用处,print里 % 与 {} 的占位作用区别是?{}好像是带格式输出 # remove方法,删除链表中的某个元素节点 def remove(self,item): current=self._head pre=None while current!=None: if current.getItem()==item: if not pre: # if pre 代表在问pre是不是真的;if not pre 在问pre是不是假的; self._head=current.getNext() else: pre.setNext(current.getNext()) break # break语句用在while和for循环中,此处打破了所在的while循环 else: pre=current current=current.getNext() # insert方法,在链表中指定位置插入节点元素 def insert(self,pos,item): if pos<=1: self.add(item) elif pos>self.size(): self.append(item) else: temp = Node(item) current = self._head count = 1 pre = None while count < pos: pre = current current = current.getNext() count += 1 pre.setNext(temp) temp.setNext(current) if __name__=="__main__": l1=SingleLinkedList() print (l1.isEmpty()) print '======0=======' l1.append(3) l1.add(999) print (l1.isEmpty()) print 'size is :', l1.size() l1.travel() print '======1=======' l1.insert(-3,110) print 'size is :', l1.size() l1.travel() print '======2=======' l1.insert(99, 111) #虽然要求insert位置是99,但实际上插在最后一个节点,即第4个 print 'size is :', l1.size() l1.travel() print '======3=======' l1.insert(90, 10) # 虽然要求insert位置是90,但实际上当前90位不存在,所以插在当前最后一个节点,即第5个 print 'size is :', l1.size() print 'Value %d index is :'% 999, l1.index(999) l1.travel() print '======4=======' l1.remove(111) print 'size is :', l1.size() l1.travel()
【补充】