zoukankan      html  css  js  c++  java
  • python 单向链表

      1 # -*- coding: utf-8 -*-
      2 # @author: Tele
      3 # @Time  : 2019/04/22 下午 3:17
      4 # 单向链表的实现
      5 # 每个节点包含两部分,数据区和指向下个节点的链接
      6 # 单向列表:每个节点包含两部分:数据区与链接区(指向下一个节点),最后一个元素的链接区为None
      7 # 单向列表只要找到头节点,就可以访问全部节点
      8 class SingleNode:
      9     def __init__(self, data, next=None):
     10         self.data = data
     11         # next指向下一个节点而不是数据
     12         self.next = next
     13 
     14 
     15 # 使用链表时只需要传入待存储的数据而不是节点
     16 class SingleLinkedList:
     17     def __init__(self, data=None):
     18         node = SingleNode(data)
     19         self.__head = node if node.data else None
     20 
     21     def is_empty(self):
     22         return self.__head == None
     23 
     24     def length(self):
     25         count = 0
     26         cur = self.__head
     27         while cur:
     28             count += 1
     29             cur = cur.next
     30         return count
     31 
     32     # 头部添加元素
     33     def add(self, data):
     34         node = SingleNode(data)
     35         node.next = self.__head
     36         self.__head = node
     37 
     38     # 尾部添加元素
     39     def append(self, data):
     40         node = SingleNode(data)
     41         if self.is_empty():
     42             self.__head = node
     43         else:
     44             cur = self.__head
     45             # 最后一个节点的next为None
     46             while cur.next:
     47                 cur = cur.next
     48             cur.next = node
     49 
     50     # 指定位置插入
     51     def insert(self, pos, data):
     52         node = SingleNode(data)
     53         cur = self.__head
     54         count = 0
     55         if self.length() >= pos >= 0:
     56             while cur:
     57                 if count + 1 == pos:
     58                     node.next = cur.next
     59                     cur.next = node
     60                     break
     61                 # pos为0
     62                 elif count == pos:
     63                     self.add(data)
     64                     break
     65                 count += 1
     66                 cur = cur.next
     67         elif pos < 0:
     68             self.add(data)
     69         else:
     70             self.append(data)
     71         # 如果列表中插入时没有元素
     72         if not self.__head:
     73             self.append(data)
     74 
     75     # 遍历
     76     def travel(self):
     77         cur = self.__head
     78         while cur:
     79             print(cur.data)
     80             cur = cur.next
     81 
     82     # 移除出现的第一个元素
     83     def remove(self, data):
     84         if self.is_empty():
     85             return
     86         node = self.__find(data)
     87         cur = self.__head
     88         while cur:
     89             # 如果要移除的元素是头节点
     90             if cur.data == node.data:
     91                 self.__head = cur.next
     92                 break
     93             elif cur.next.data == node.data:
     94                 cur.next = node.next
     95                 break
     96             cur = cur.next
     97 
     98     # 私有方法,用于查找节点
     99     def __find(self, data):
    100         cur = self.__head
    101         node = SingleNode(data)
    102         while cur:
    103             if cur.data == data:
    104                 node.next = cur.next
    105                 break
    106             cur = cur.next
    107         return node
    108 
    109     # 查找,找不到返回-1,找到则返回索引
    110     def search(self, data):
    111         index = -1
    112         cur = self.__head
    113         count = 0
    114         while cur:
    115             if cur.data == data:
    116                 index = count
    117                 break
    118             count += 1
    119             cur = cur.next
    120         return index
    121 
    122 
    123 def main():
    124     ssl = SingleLinkedList()
    125     print(ssl.is_empty())
    126     print(ssl.length())
    127     # ssl.append(1)
    128     # ssl.append(100)
    129     # ssl.append(2)
    130     # ssl.append(200)
    131     # ssl.append(3)
    132     # ssl.append(4)
    133     print(ssl.is_empty())
    134     print(ssl.length())
    135 
    136     # 遍历
    137     print("*" * 50)
    138     # ssl.travel()
    139 
    140     ssl.add(100)
    141     # ssl.travel()
    142     # 为负数时作为头节点
    143     ssl.insert(-1, "sss")
    144     ssl.travel()
    145     print("*" * 50)
    146     print(ssl.search("sss"))  # 0
    147     print("*" * 50)
    148     ssl.remove(100)
    149     ssl.travel()
    150 
    151 
    152 if __name__ == '__main__':
    153     main()
  • 相关阅读:
    学习视频收集
    vscode 编译器插件
    vue2.0父子组件之间传值
    js 案例
    插件
    【转】30分钟掌握 C#6
    【初码干货】关于.NET玩爬虫这些事
    上机作业七 系统进程与计划任务管理
    客户端与服务器双向密钥对验证
    DHCP中继配置
  • 原文地址:https://www.cnblogs.com/tele-share/p/10756418.html
Copyright © 2011-2022 走看看