单向链表

  1 class Node(object):
  2     def __init__(self,elem):
  3         #elem指数据元素
  4         self.elem = elem
  5         #指向下一个节点的链接域
  6         self.next = None
  7 #构造单向链表类
  8 class singleLinkList:
  9     #初始化方法
 10     def __init__(self,node=Node):
 11         #判断node是否为空
 12         if node != None:
 13             headNode = Node(node)
 14             self.__head = headNode
 15         else:    
 16             self.__head = node  #私有属性
 17 
 18     #在头部添加元素
 19     def add(self,item):
 20         #将传入的值构造成节点
 21         node = Node(item)
 22         #将新节点的链接域next指向头节点
 23         node.next = self.__head
 24         #将链表的头__head指向新节点
 25         self.__head = node
 26     
 27     #在单向链表尾部追加元素 
 28     def append(self,item):
 29         #将传入的值构造成节点
 30         node = Node(item)
 31         if self.is_empty():
 32             self.__head = node
 33         else: #单链表不为空
 34             curNode = self.__head
 35             while curNode.next != None:
 36                 curNode = curNode.next
 37             #修改节点指向,最后一个节点的next指向node
 38             curNode.next = node
 39 
 40     #在指定位置添加元素
 41     def insert(self,pos,item):
 42         #如果传入的pos是小于等于0的数,默认的插入头部
 43         if pos <= 0:
 44             self.add(item)
 45         #如果pos的值大于链表长度,直接插入到尾部
 46         elif pos > (self.length()-1):
 47             self.append(item)
 48         else:
 49             #构造节点
 50             node = Node(item)
 51             count = 0
 52             preNode = self.__head
 53             while count < (pos-1): #**寻找前一个节点
 54                 count += 1
 55                 preNode = preNode.next
 56             #修改指向
 57             #将前一个节点的next指向插入位置节点
 58             node.next = preNode.next
 59             #将插入位置的前一个节点的next指向新节点
 60             preNode.next = node 
 61 
 62 
 63     #删除节点
 64     def remove(self,item):
 65         curNode = self.__head
 66         preNode = None
 67         while curNode != None:
 68             if curNode.elem == item:
 69                 #判断是否是头节点
 70                 if preNode == None:#是头节点
 71                     self.__head = curNode.next
 72                 else:
 73                     preNode.next = curNode.next
 74                 break #否则会出现死循环
 75             else:
 76                 preNode = curNode
 77                 curNode = curNode.next
 78 
 79     #查找节点是否存在
 80     def search(self,item):
 81         curNode = self.__head
 82         while curNode != None:
 83             if curNode.elem == item:
 84                 return True
 85             curNode = curNode.next
 86         return False
 87 
 88     #判断单向链表是否为空
 89     def is_empty(self):
 90         #判断head指向是None,如果是None则是空链表
 91         #if self.__head == None:
 92         #    return True
 93         #else:
 94         #    return False
 95         return self.__head == None
 96 
 97     #计算单向链表的长度
 98     def length(self):
 99         count = 0
100         curNode = self.__head
101         while curNode != None:
102             count += 1
103             curNode = curNode.next
104         return count
105     def travel(self):
106         curNode = self.__head
107         while curNode != None:
108             print(curNode.elem,end='\t')
109             curNode = curNode.next
110         print('')
111 if __name__ == '__main__':
112     #初始化元素值为20的单向链表
113     singleLinkList = singleLinkList(20)
114     #初始化一个空的链表
115     #singleLinkList = singleLinkList()
116     print('是否是空列表:',singleLinkList.is_empty())
117     #print('链表的长度为:',singleLinkList.length())
118     print('--------------遍历单链表-------------')
119     singleLinkList.travel()
120     print('-----------------查找----------------')
121     print(singleLinkList.search(20))
122     #print(singleLinkList.search(30))
123     print('---------------头部插入--------------')
124     singleLinkList.add(1)
125     singleLinkList.add(2)
126     singleLinkList.add(3)
127     singleLinkList.travel()
128     print('--------------尾部追加--------------')
129     singleLinkList.append(10)
130     singleLinkList.append(30)
131     singleLinkList.append(40)
132     singleLinkList.travel()
133     print('链表的长度为:',singleLinkList.length())
134     print('-------------指定位置插入------------')
135     singleLinkList.insert(2,100)
136     singleLinkList.travel()
137     singleLinkList.insert(0,200)
138     singleLinkList.travel()
139     singleLinkList.insert(100,300)
140     singleLinkList.travel()
141     print('-------------- 删除节点---------------')
142     singleLinkList.remove(200)
143     singleLinkList.travel()
144     singleLinkList.remove(300)
145     singleLinkList.travel()
 1 是否是空列表: False
 2 --------------遍历单链表-------------
 3 20
 4 -----------------查找----------------
 5 True
 6 ---------------头部插入--------------
 7 3       2       1       20
 8 --------------尾部追加--------------
 9 3       2       1       20      10      30      40
10 链表的长度为: 7
11 -------------指定位置插入------------
12 3       2       100     1       20      10      30      40
13 200     3       2       100     1       20      10      30      40
14 200     3       2       100     1       20      10      30      40      300
15 -------------- 删除节点---------------
16 3       2       100     1       20      10      30      40      300
17 3       2       100     1       20      10      30      40

 

posted @ 2020-05-13 15:52  小他_W  阅读(199)  评论(0编辑  收藏  举报