单链表复习

  1 # 实现单链表
  2 class Node(object):
  3     '''定义一个节点'''
  4     def __init__(self,data):
  5         # 因为每次都需要生成一个节点,写到类里面便于保存
  6         self.data = data 
  7         # 保存节点的值
  8         self.next = None
  9         # 默认将节点的指向为空
 10     # 二元组也可以实现节点 (data,next指针域) ,为了通用性不使用二元组
 11 
 12 class DanLianBiao(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 == 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)
 46             # 打印数据
 47             cur = cur.next
 48             # 向下遍历
 49 
 50     def add(self,data):
 51         '''链表头部添加元素'''
 52         node = Node(data)
 53         self._head = node
 54         # 将节点指向头部
 55         node.next = self._head
 56         # 将头部作为节点的下一个元素
 57 
 58 
 59     def append(self,data):
 60            '''链表尾部添加元素'''
 61            node = Node(data)
 62            # 创建一个节点
 63 
 64            # 特殊情况 第一个节点为空
 65            if self.is_empty():
 66                self._head = node
 67                # 头节点为 node 
 68            else:
 69                cur = self._head
 70                while cur.next != None:
 71                    cur = cur.next
 72                # cur.next.data = node.data 
 73                # 不需要添加数据
 74                cur.next = node
 75                # 添加节点
 76 
 77     def insert(self,pos,data):
 78            '''指定位置添加元素'''
 79            # 如果为零位置 
 80            if pos <= 0:
 81                self.add(data)
 82                # 添加节点
 83            elif pos > (self.length()-1):
 84                # 到最后一个元素
 85                self.append(data)
 86                # 添加节点
 87            else:
 88                node = Node(data)
 89                index = 0
 90                cur = self._head
 91                while index < pos :
 92                    # 遍历到 pos 前一个位置
 93                    index += 1
 94                    cur = cur.next 
 95                    # 不断向下移动
 96                node.next = cur.next 
 97                # 先和右面元素建立联系 防止与左面元素失联
 98                cur.next = node 
 99             
100     def remove(self,data):
101            '''删除节点'''
102            cur = self._head
103            pre = None 
104            # 设置游标表示前一个游标
105            while cur != None:
106                if cur.data == data:
107                    # 如果 cur 指向的节点为要删除的节点
108                    if cur == self._head:
109                        # 如果数据为头节点的数据
110                        self._head = cur.next 
111                        # 跳过 cur 
112                    else:
113                        # 如果不是头节点
114                        pre.next = cur.next
115                        # 跳过 cur 指向的节点
116                    break
117                    # 找到数据跳出循环
118                else:
119                    # 如果还没有找到数据
120                    pre = cur
121                    cur = cur.next
122                    # 向下移动
123 
124     def search(self,data):
125         '''查找节点是否存在'''
126         cur = self._head
127         # 指向头节点
128         while cur.next != None:
129             # 如果下一个节点不为空
130             if cur.data == data:
131                 # 如果找到了数据
132                 return True
133             else:
134                 cur = cur.next
135                 # 继续向下寻找
136         return False
137         # 没有找到该数据
138 
139 
140         

2020-04-14

原文地址:https://www.cnblogs.com/hany-postq473111315/p/12695182.html