Fork me on GitHub

Python实现不带头结点的单链表

  1 # 创建一个节点类
  2 class Node:
  3     def __init__(self, item):
  4         self.item = item
  5         self.next = None
  6 
  7 
  8 # 创建一个单链表类
  9 class SingleLink:
 10     def __init__(self):
 11         self.header = None  # 初始化单链表的头结点
 12         self.length = 0  # length:单链表的长度
 13 
 14     # 判断单链表是否为空
 15     def is_empty(self):
 16         if self.header is None:
 17             return True
 18         else:
 19             return False
 20 
 21     '''
 22         实现向单链表添加元素的功能:
 23         有三种实现方式:
 24         1.头插法
 25         2.尾插法
 26         3.从任意指定位置添加元素
 27     '''
 28 
 29     # 1.头插法
 30     def preadd(self, value):
 31         node = Node(value)
 32         if self.is_empty():
 33             self.header = node
 34         else:
 35             node.next = self.header
 36             self.header = node
 37         self.length += 1
 38 
 39     # 2.尾插法
 40     def append(self, value):
 41         node = Node(value)
 42         cur = self.header
 43         if self.length==0:
 44             self.preadd(value)
 45             return
 46         while cur.next is not None:
 47             cur = cur.next
 48         cur.next = node
 49         self.length += 1
 50 
 51     # 3.从任意指定位置添加元素
 52     def insert(self, index, value):
 53         node = Node(value)
 54         cur = self.header
 55         if index <= 0:
 56             self.preadd(value)
 57             self.length += 1
 58         elif index > self.length:
 59             self.append(value)
 60             self.length += 1
 61         else:
 62             for i in range(1, index - 1):
 63                 cur = cur.next
 64             node.next = cur.next
 65             cur.next = node
 66             self.length += 1
 67 
 68     '''
 69         实现从单链表中删除元素的功能
 70         有三种删除方式:
 71         1.根据指定位置来删除元素
 72         2.直接删除元素
 73         3.清空单链表
 74     '''
 75 
 76     # 1.根据指定位置来删除元素
 77     def __delitem__(self, index):
 78         if index <= 0 or index > self.length:
 79             raise IndexError
 80         if index == 1:
 81             self.header = self.header.next
 82         else:
 83             cur = self.header
 84             for i in range(1, index - 1):
 85                 cur = cur.next
 86             cur.next = cur.next.next
 87         self.length -= 1
 88 
 89     # 2.直接删除元素
 90     def __delete__(self, value):
 91         self.__delitem__(self.isExist(value))
 92         self.length -= 1
 93 
 94     # 3.清空单链表
 95     def clear(self):
 96         while self.length != 0:
 97             self.__delitem__(self.length)
 98             self.length -= 1
 99     '''
100         实现修改元素的功能
101         1.修改指定位置的元素
102     '''
103     # 1.修改指定位置的元素
104     def __setitem__(self, index, value):
105         cur=self.header
106         if not isinstance(index,int):
107             raise TypeError
108         if 0<index<self.length:
109             for i in range(index-1):
110                 cur=cur.next
111             cur.item=value
112         else:
113             print('您输入的信息有误!')
114     '''
115         实现对单链表的查找功能
116         有三种实现方式:
117         1.查找某元素,并返回其在链表中的位置
118         2.根据位置来查找对应的元素
119         3.遍历单链表,查找出所有元素
120     '''
121 
122     # 1.查找某元素,并返回其在链表中的位置
123     def isExist(self, value):
124         cur = self.header
125         for i in range(self.length):
126             if cur.item == value:
127                 return i + 1
128             cur = cur.next
129 
130     # 2.根据位置来查找对应的元素
131     def __getitem__(self, index):
132         cur = self.header
133         if index <= 0 or index > self.length:
134             return print('您输入的信息有误')
135         for i in range(index - 1):
136             cur = cur.next
137         return print('第%d个位置的元素是%d' % (index, cur.item))
138 
139     # 3.遍历单链表,查找出所有元素
140     def show(self):
141         cur = self.header
142         if self.length == 0:
143             print('目前单链表中没有数据!')
144         else:
145             print('目前单链表的元素有:', end=' ')
146             for i in range(self.length):
147                 print('%s' % cur.item, end=' ')
148                 cur = cur.next
149             print('\n')
150 
151 
152 if __name__ == '__main__':
153     s = SingleLink()
154     s.preadd(12)
155     s.preadd(23)
156     s.preadd(32)
157     s.show()
158     s.append(14)
159     s.append(43)
160     s.append(15)
161     s.show()
162     print('元素32在单链表的第%d个位置' % s.isExist(32))
163     print('从第三个位置插入元素:57')
164     s.insert(3, 57)
165     s.show()
166     print('删除第一个位置的元素')
167     s.__delitem__(1)
168     s.show()
169     print('直接删除元素43:')
170     s.__delete__(43)
171     s.show()
172     s.__getitem__(2)
173     s.__setitem__(3,9000)
174     s.show()
175     print('清空单链表:')
176     s.clear()
177     s.show()

 

posted @ 2022-02-14 15:27  wangkx  阅读(646)  评论(0编辑  收藏  举报