• python实现双向链表


    双向链表

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

     

    实现

    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 is None
    
        def length(self):
            """返回链表的长度"""
            cur = self.head
            count = 0
            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)
                cur = cur.next
            print("遍历完了")
    
        def add(self, item):
            node = Node(item)
            if self.is_empty():
                self.head = node
            else:
                node.next = self.head
                self.head.prev = node
                self.head = node
    
        def append(self, item):
            """尾部插入元素"""
            node = Node(item)
            if self.is_empty():
                self.head = node
            else:
                cur = self.head
                while cur.next is not None:
                    cur = cur.next
                cur.next = node
                node.prev = cur
    
        def search(self, item):
            cur = self.head
            while cur is not 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的关系设置好
                node.prev = cur
                node.next = cur.next
                # 再配置cur的关系
                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 is None:
                        # 如果链表只有这一个节点
                        self.head = None
                    else:
                        # 将第二个节点的prev设置为None
                        cur.next.prev = None
                        self.head = cur.next
                    return
                # 遍历节点
                while cur is not None:
                    if cur.item == item:
                        cur.prev.next = cur.next
                        cur.next.prev = cur.prev
                        break
                    cur = cur.next
    
    
    if __name__ == '__main__':
        lst1 = DLinkList()
        lst1.add(1)
        lst1.add(2)
        lst1.append(3)
        lst1.insert(1, 4)
        lst1.travel()
        print(lst1.is_empty())
        lst1.remove(2)
        lst1.travel()
        lst1.remove(10)
        lst1.travel()
    双向链表的实现
  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/zzliu/p/10555451.html
Copyright © 2020-2023  润新知