美文网首页我爱编程
数据结构与算法--链表(双向链表)

数据结构与算法--链表(双向链表)

作者: 墨痕hz | 来源:发表于2018-05-28 16:24 被阅读31次

    一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。


    双向链表.png

    具体操作

    • is_empty() 链表是否为空
    • length() 链表长度
    • travel() 遍历链表
    • add(item) 链表头部添加
    • append(item) 链表尾部添加
    • insert(pos, item) 指定位置添加
    • remove(item) 删除节点
    • search(item) 查找节点是否存在

    指定位置插入节点(图示)

    双向链表指定位置插入元素.png

    删除元素(图示)

    双向链表删除节点.png

    具体代码实现

    class Node(object):
        """双向链表节点"""
        def __init__(self,item):
            self.item=item
            self.next=None
            self.prev=None
    
    class DLinkList(object):
        """双向链表"""
        def __init__(self):
            self.__head=None
    
        def is_empty(self):
            """判断链表是否为空"""
            return self.__head==None
    
        def length(self):
            """返回链表的长度"""
            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.item)
                cur=cur.next
            print("")
    
        def add(self,item):
            """头部插入元素"""
            node=Node(item)
            if self.is_empty():
                #如果是空链表,将_head指向node
                self.__head=node
    
            else:
                #将node的next指向_head的头结点
                node.next=self.__head
                #将_head的头结点的prev指向node
                self.__head.prev=node
                #将_head指向node
                self.__head=node
    
        def append(self,item):
            """尾部元素插入"""
            node=Node(item)
            if self.is_empty():
                #如果是空链表,将_head指向node
                self.__head=node
    
            else:
                #移动到链表尾部
                cur=self.__head
                while cur.next!=None:
                    cur=cur.next
                #将为节点cur的next指向node
                cur.next=node
                #将node的prev指向cur
                node.prev=cur
    
        def search(self,item):
            """查找元素是否存在"""
            cur=self.__head
            while cur!=None:
                if cur.item==item:
                    return True
                cur=cur.next
            return False
    
    
        def insert(self,pos,item):
            if pos<=0:
                self.add(item)
            elif pos>(self.length()-1):
                self.append(item)
            else:
                node=Node(item)
                cur=self.__head
                count=0
                while count<(pos-1):
                    count+=1
                    cur=cur.next
    
                node.prev=cur
                node.next=cur.next
                cur.next.prev=node
                cur.next=node
    
    
        def remove(self,item):
            if self.is_empty():
                return
            else:
                cur=self.__head
                if cur.item==item:
                    if cur.next==None:
                        self.__head=None
                    else:
                        cur.next.prev=None
                        self.__head=cur.next
                    return
                while cur!=None:
                    if cur.item==item:
                        cur.prev.next=cur.next
                        cur.next.prev=cur.prev
                        break
    
                    cur=cur.next
    
    if __name__=='__main__':
        ll=DLinkList()
        ll.add(1)
        ll.add(2)
        ll.append(3)
        ll.insert(2, 4)
        ll.insert(4, 5)
        ll.insert(0, 6)
        print ("length:",ll.length())
        ll.travel()
        print (ll.search(3))
        print (ll.search(4))
        ll.remove(1)
        print ("length:",ll.length())
        ll.travel()
    

    参考:数据结构与算法Python语言描述

    相关文章

      网友评论

        本文标题:数据结构与算法--链表(双向链表)

        本文链接:https://www.haomeiwen.com/subject/qnpgjftx.html