python 数据结构与算法 day02 双向链表

1.实现双向链表

#_+_coding:utf-8_*_
#author:    xuanxuan
#Time :     2018/11/7  8:48

class Node():
    def __init__(self,item):
        self.item=item
        self.prev=None  # 前驱结点
        self.next=None  # 后继结点

class DoubleLinkList(object):
    def __init__(self,node=None):
        self.__head=node

    def is_empty(self):
        """判断双向链表是否为空"""
        if self.__head is None:
            return True
        return False

    def length(self):
        """求双向链表的长度"""
        count=0
        cur=self.__head
        while cur is not None:
            count+=1
            cur = cur.next
        return count

    def travel(self):
        """实现双向链表的遍历"""
        cur=self.__head
        while cur is not None:
            print(cur.item,end=" ")
            cur=cur.next
        print("")

    def add(self,item):
        """在双向链表的头部添加结点(元素)"""
        node=Node(item)
        if self.__head is None:  # 双向链表为空
            self.__head=node
        else:
            node.next=self.__head
            self.__head.prev=node
            self.__head=node

    def append(self,item):
        """在双向链表的尾部追加结点(元素)"""
        node=Node(item)
        if self.__head is None: # 双向链表为空
            self.__head=node
        else:
            cur=self.__head
            while cur.next is not None:
                cur=cur.next
            node.prev=cur
            cur.next=node

    def insert(self,pos,item):
        """在双向链表的任意位置插入结点(元素)"""
        node=Node(item)
        if pos<=0:
            self.add(item)
        elif pos>=self.length():
            self.append(item)
        else:
            count=0
            cur=self.__head
            while count<pos:
                cur=cur.next
                count+=1
            node.next=cur
            node.prev=cur.prev
            cur.prev=node
            node.prev.next=node
    def remove(self,item):
        """从双向链表中删除一个元素"""
        if self.search(item):
            cur=self.__head
            if self.__head.item==item:
                self.__head=self.__head.next
                if self.__head.next: # 只有一个结点,删除第一个结点
                    self.__head.next.prev=None
            else:
                while cur is not None:
                    if cur.next is None:  # 删除最后一个结点
                        cur.prev.next=None
                        break
                    if cur.item==item:
                        cur.prev.next=cur.next
                        cur.next.prev = cur
                        break
                    else:
                        cur=cur.next




    def search(self,item):
        """判断双向链表中是否存在该元素"""
        cur=self.__head
        while cur is not None:
            if cur.item==item:
                return True
            cur=cur.next
        return False


if __name__=="__main__":
    dll=DoubleLinkList()
    print(dll.is_empty())
    dll.append(1)
    dll.append(2)
    dll.append(3)
    dll.append(4)
    dll.add(0)
    print(dll.length())
    dll.travel()
    dll.insert(0,1000)
    dll.insert(5,200)
    dll.travel()
    dll.remove(200)
    dll.remove(1000)
    dll.travel()

运行结果:

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9924668.html