双链表复习

  1 # 实现双链表
  2 class Node(object):
  3     # 前驱 数据 后继
  4     def __init__(self,data):
  5         self.pre = None
  6         # 前驱
  7         self.data = self.data 
  8         # 数据
  9         self.next = None
 10         # 后继
 11 
 12 class DoubleLianBiao(object):
 13     # 定义一个双链表 将节点连接起来
 14     def __init__(self,node = None):
 15         # 指向节点 如果没传递则使用 None
 16         self._head = node
 17         # 定义头节点,指向实例化类对象时传递的节点指向
 18 
 19     def is_empty(self):
 20         '''链表是否为空'''
 21         return self._head is None
 22 
 23     def length(self):
 24         '''查询链表长度'''    
 25         cur = self._head
 26         # cur 为当前指向的指针
 27         count = 0 
 28         # 记录长度
 29         while cur != None:
 30             # 当前指向不为 None
 31             count += 1 
 32             # 数量加 1
 33             cur = cur.next
 34             # 将指针对节点进行移动
 35         # 如果第一个节点为 None ,依旧是返回 0
 36         return count
 37         # 返回节点数量
 38 
 39 
 40     def travel(self):
 41         '''遍历整个链表'''
 42         cur = self._head
 43         while cur != None:
 44             # 如果不为空 则打印数据
 45             print(cur.data,end = " ")
 46             # 打印数据
 47             cur = cur.next
 48             # 向下遍历
 49 
 50 
 51     def add(self,data):
 52         '''链表头部添加元素'''
 53         node = Node(data)
 54         # 将节点指向头部
 55         node.next = self._head
 56         # 将头部作为节点的下一个元素
 57         self._head = node
 58         # 将 node 作为头节点
 59         node.next.pre = node
 60         # 牵右手 让 node 后的节点指向node
 61 
 62     def append(self,data):
 63            '''链表尾部添加元素'''
 64            node = Node(data)
 65            # 创建一个节点
 66 
 67            # 特殊情况 第一个节点为空
 68            if self.is_empty():
 69                self._head = node
 70                # 头节点为 node 
 71            else:
 72                cur = self._head
 73                while cur.next != None:
 74                    cur = cur.next
 75                # cur.next.data = node.data 
 76                # 不需要添加数据
 77                cur.next = node
 78                # 添加节点
 79                node.pre = cur 
 80                # 连接左面的两只手 
 81 
 82     def insert(self,pos,data):
 83            '''指定位置添加元素'''
 84            # 如果为零位置 
 85            if pos <= 0:
 86                self.add(data)
 87                # 添加节点
 88            elif pos > (self.length()-1):
 89                # 到最后一个元素
 90                self.append(data)
 91                # 添加节点
 92            else:
 93                node = Node(data)
 94                index = 0
 95                cur = self._head
 96                while index < pos :
 97                    # 遍历到 pos 前一个位置
 98                    index += 1
 99                    cur = cur.next 
100                    # 不断向下移动
101                node.next = cur
102                # 右手:node 连接 当前指向的节点
103                node.pre = cur.pre
104                # 左手:node 的前一个节点为当前位置的前一个节点
105                cur.pre.next = node
106                # 左手:当前位置的前一个节点的下一个节点为 node 节点
107                cur.pre = node
108                # 右手:当前位置的前一个节点 为 node 节点    
109 
110     def remove(self,data):
111            '''删除节点'''
112            cur = self._head
113            # 设置游标表示前一个游标
114            while cur != None:
115                if cur.data == data:
116                    # 如果 cur 指向的节点为要删除的节点
117                    if cur == self._head:
118                        # 如果数据为头节点的数据
119                        self._head = cur.next 
120                        # 跳过 cur 
121                        if cur.next != None:
122                            # 如果只有一个节点,None 没有pre属性
123                            cur.next.pre = None
124                            # 删除头节点后 头节点值为 None
125                    else:
126                        # 如果不是头节点
127                        cur.pre.next = cur.next
128                        # 左手:当前节点的前一个节点的后一个节点为当前节点的后一个节点
129                        if cur.next != None:
130                            # 查看是否是最后一个节点,None 没有 pre 属性
131                            cur.next.pre = cur.pre 
132                            # 右手:当前节点的下一个节点的前一个节点为当前节点的前一个节点
133                    break
134                    # 找到数据跳出循环
135                else:
136                    # 如果还没有找到数据
137                    cur = cur.next
138                    # 向下移动
139 
140     def search(self,data):
141         '''查找节点是否存在'''
142         cur = self._head
143         # 指向头节点
144         while cur.next != None:
145             # 如果下一个节点不为空
146             if cur.data == data:
147                 # 如果找到了数据
148                 return True
149             else:
150                 cur = cur.next
151                 # 继续向下寻找
152         return False
153         # 没有找到该数据

2020-04-14

posted @ 2020-04-14 12:57  CodeYaSuo  阅读(127)  评论(0编辑  收藏  举报