美文网首页
双向链表

双向链表

作者: 胖虎很可爱 | 来源:发表于2018-02-28 19:52 被阅读0次

    双向链表

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

    图片.png

    操作

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

    实现

    # coding:utf-8
    
    class Node(object):
        """结点"""
        def __init__(self, item):
            self.elem = item
            self.next = None
            self.prev = None
    
    
    class DoubleLinkList(object):
        """双链表"""
        def __init__(self, node=None):
            self.__head = node
    
        def is_empty(self):
            """链表是否为空"""
            return self.__head == None
    
        def length(self):
            """链表长度"""
            # cur游标,用来移动遍历节点
            cur = self.__head
            # count记录数量
            count = 0
            while cur != None:
                count += 1
                cur = cur.next
            return count
    
        def travel(self):
            """遍历整个链表"""
            cur = self.__head
            while cur != None:
                print(cur.elem, end=" ")
                cur = cur.next
            print("")
    
        def add(self, item):
            """链表头部添加元素,头插法"""
            node = Node(item)
            if self.is_empty():
                self.__head = node
                return
            node.next = self.__head
            self.__head = node
            node.next.prev = node
    
        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):
            """指定位置添加元素
            :param  pos 从0开始
            """
            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
                # 当循环退出后,cur指向pos位置
                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.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 __name__ == "__main__":
        ll = DoubleLinkList()
        print(ll.is_empty())
        print(ll.length())
    
        ll.append(1)
        print(ll.is_empty())
        print(ll.length())
    
        ll.append(2)
        ll.add(8)
        ll.append(3)
        ll.append(4)
        ll.append(5)
        ll.append(6)
        # 8 1 2 3 4 5 6
        ll.insert(-1, 9)  # 9 8 1 23456
        ll.travel()
        ll.insert(3, 100)  # 9 8 1 100 2 3456
        ll.travel()
        ll.insert(10, 200)  # 9 8 1 100 23456 200
        ll.travel()
        ll.remove(100)
        ll.travel()
        ll.remove(9)
        ll.travel()
        ll.remove(200)
        ll.travel()
    
    

    相关文章

      网友评论

          本文标题:双向链表

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