【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()

 

 

 

 

 

 

 

 

【补充】

 

posted @ 2019-07-16 10:32  anno_ym雨  阅读(369)  评论(0编辑  收藏  举报