python的链表

转载自博客
单链表的python实现.

1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 # @Date    : 2018-06-12 11:23:21
  4 # @Author  : yudanqu (943775910@qq.com)
  5 # @Link    : https://www.cnblogs.com/yudanqu/
  6 # @Version : $Id$
  7 
  8 
  9 class Node(object):
 10     """节点"""
 11 
 12     def __init__(self, elem):
 13         self.elem = elem
 14         self.next = None  # 初始设置下一节点为空
 15 
 16 '''
 17 上面定义了一个节点的类,当然也可以直接使用python的一些结构。比如通过元组(elem, None)
 18 '''
 19 
 20 
 21 # 下面创建单链表,并实现其应有的功能
 22 
 23 
 24 class SingleLinkList(object):
 25     """单链表"""
 26 
 27     def __init__(self, node=None):  # 使用一个默认参数,在传入头结点时则接收,在没有传入时,就默认头结点为空
 28         self.__head = node
 29 
 30     def is_empty(self):
 31         '''链表是否为空'''
 32         return self.__head == None
 33 
 34     def length(self):
 35         '''链表长度'''
 36         # cur游标,用来移动遍历节点
 37         cur = self.__head
 38         # count记录数量
 39         count = 0
 40         while cur != None:
 41             count += 1
 42             cur = cur.next
 43         return count
 44 
 45     def travel(self):
 46         '''遍历整个列表'''
 47         cur = self.__head
 48         while cur != None:
 49             print(cur.elem, end=' ')
 50             cur = cur.next
 51         print("\n")
 52 
 53     def add(self, item):
 54         '''链表头部添加元素'''
 55         node = Node(item)
 56         node.next = self.__head
 57         self.__head = node
 58 
 59     def append(self, item):
 60         '''链表尾部添加元素'''
 61         node = Node(item)
 62         # 由于特殊情况当链表为空时没有next,所以在前面要做个判断
 63         if self.is_empty():
 64             self.__head = node
 65         else:
 66             cur = self.__head
 67             while cur.next != None:
 68                 cur = cur.next
 69             cur.next = node
 70 
 71     def insert(self, pos, item):
 72         '''指定位置添加元素'''
 73         if pos <= 0:
 74                 # 如果pos位置在0或者以前,那么都当做头插法来做
 75             self.add(item)
 76         elif pos > self.length() - 1:
 77             # 如果pos位置比原链表长,那么都当做尾插法来做
 78             self.append(item)
 79         else:
 80             per = self.__head
 81             count = 0
 82             while count < pos - 1:
 83                 count += 1
 84                 per = per.next
 85             # 当循环退出后,pre指向pos-1位置
 86             node = Node(item)
 87             node.next = per.next
 88             per.next = node
 89 
 90     def remove(self, item):
 91         '''删除节点'''
 92         cur = self.__head
 93         pre = None
 94         while cur != None:
 95             if cur.elem == item:
 96                 # 先判断该节点是否是头结点
 97                 if cur == self.__head:
 98                     self.__head = cur.next
 99                 else:
100                     pre.next = cur.next
101                 break
102             else:
103                 pre = cur
104                 cur = cur.next
105 
106     def search(self, item):
107         '''查找节点是否存在'''
108         cur = self.__head
109         while not cur:
110             if cur.elem == item:
111                 return True
112             else:
113                 cur = cur.next
114         return False
115 
116 
117 if __name__ == "__main__":
118 
119         # node = Node(100)  # 先创建一个节点传进去
120 
121     ll = SingleLinkList()
122     print(ll.is_empty())
123     print(ll.length())
124 
125     ll.append(3)
126     ll.add(999)
127     ll.insert(-3, 110)
128     ll.insert(99, 111)
129     print(ll.is_empty())
130     print(ll.length())
131     ll.travel()
132     ll.remove(111)
133     ll.travel()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值