# 尾部插入
def addBack(self, item):
node = Node(item)
if self.__head is None:
self.__head = node
return
cur = self.__head
pre = None
while cur:
pre = cur
cur = cur.next
# 当cur 为最后一个节点时带入,pre更新为最后一个节点,cur更新为最后一个节点的下一个节点即为空,
# 下一次while cur 时会退出循环,此时的pre表示的就是最后一个节点,将node挂到pre的后面即可
pre.next = node
# 插入(这一块代码自己觉得还是可以改进)
def insert(self, pos, item):
if pos > (self.size() + 1) or pos < 1:
return
if pos == 1:
self.addFront(item)
return
node = Node(item)
cur = self.__head
pre = None
for i in range(pos - 1):
pre = cur
cur = cur.next
pre.next = node
node.next = cur
# 删除尾部节点
def removeBack(self):
# 空节点时
if self.__head is None:
return
# 只有一个节点
if self.__head and self.__head.next is None:
self.__head = None
return
# 链表节点有两个及以上
cur = self.__head # 当前节点
pre = None # 前一个节点
cn = cur.next # 后一个节点
# 刚开始cur取到的是第一个节点,cn是第二个
while cn:
# 将cur 取值为倒数第二个节点即cn 为最后一个节点带入
pre = cur # (接上面注释)更新为倒数第二个
cur = cur.next # (接上面注释)更新为最后一个
cn = cur.next # (接上面注释)更新为None,下一次就不会进行while循环
pre.next = None # 将倒数第二个节点的next 设置为None就连不上原来的最后一个了
查找链表中有没有item,有返回True,没有则返回False
# 查找链表中有没有item,有返回True,没有则返回False
def search(self, item):
cur = self.__head
res = False
while cur:
if cur.item == item:
res = True
break
else:
cur = cur.next
return res
删除指定数值的节点:当找到指定数值的节点cur时,将pre节点的next指向cur.next即可
# 删除指定数值的节点
def delete(self, item):
if self.__head is None:
return
if self.__head.item == item:
self.__head = None
return
cur = self.__head.next # 取第二个节点
pre = self.__head # 第一个节点
while cur:
if cur.item == item:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
大致方法有这些,文中如若有写错的地方还望批评指出。有些地方或许有更好的实现方式,可以多试试。
完整代码
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
class Link(object):
def __init__(self):
self.__head = None
def isEmpty(self):
return self.__head is None
# 头部插入
def addFront(self, item):
node = Node(item)
node.next = self.__head
self.__head = node
# 尾部插入
def addBack(self, item):
node = Node(item)
if self.__head is None:
self.__head = node
return
cur = self.__head
pre = None
while cur:
pre = cur
cur = cur.next
# 当cur 为最后一个节点时带入,pre更新为最后一个节点,cur更新为最后一个节点的下一个节点即为空,
# 下一次while cur 时会退出循环,此时的pre表示的就是最后一个节点,将node挂到pre的后面即可
pre.next = node
def size(self):
count = 0
cur = self.__head
while cur:
count += 1
cur = cur.next
return count
def travel(self):
cur = self.__head
while cur:
print(cur.item, end=' ')
cur = cur.next
print('')
# 删除头部节点
def removeFront(self):
cur = self.__head
self.__head = self.__head.next
cur.next = None
# 删除尾部节点
def removeBack(self):
# 空节点时
if self.__head is None:
return
# 只有一个节点
if self.__head and self.__head.next is None:
self.__head = None
return
# 链表节点有两个及以上
cur = self.__head # 当前节点
pre = None # 前一个节点
cn = cur.next # 后一个节点
# 刚开始cur取到的是第一个节点,cn是第二个
while cn:
pre = cur
cur = cur.next
cn = cur.next
pre.next = None
# 查找链表中有没有item,有返回True,没有则返回False
def search(self, item):
cur = self.__head
res = False
while cur:
if cur.item == item:
res = True
break
else:
cur = cur.next
return res
# 删除指定数值的节点
def delete(self, item):
if self.__head is None:
return
if self.__head.item == item:
self.__head = None
return
cur = self.__head.next # 取第二个节点
pre = self.__head # 第一个节点
while cur:
if cur.item == item:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
# 插入节点, 节点在插入后是第 pos 个节点,当然这个函数也可以实现头部插入和尾部插入的功能
# 故pos取值1时,即头部插入,取值size+1时是尾部插入。因此取值的合法范围是[1,size + 1]
def insert(self, pos, item):
if pos > (self.size() + 1) or pos < 1:
return
if pos == 1:
self.addFront(item)
return
node = Node(item)
cur = self.__head
pre = None
for i in range(pos - 1):
pre = cur
cur = cur.next
pre.next = node
node.next = cur
ll = Link()
print(ll.isEmpty()) # 刚开始是空的,应为True
for i in range(5):
ll.addFront(i)
print('size:', ll.size()) # 加入了5个,应为5
ll.travel() # 打印输出,由于是头部添加,因此打印的应该是43210(忽略空格)
for i in range(5):
ll.addBack(i)
ll.travel() # 尾部添加,打印的应是一个对称的序列,4321001234
ll.removeFront() # 删除头部元素,下面打印应是321001234
ll.travel()
print('----')
ll.removeBack()
ll.travel() # 删除尾部元素,下面打印应是32100123
ll.insert(9, 12) # 插入后,下面打印出来的第九个是12
ll.travel()
print(ll.search(13)) # 没有,应该是False
print(ll.search(1)) # 有的,应是True
ll.delete(2) # 删除找到的第一个2
ll.travel()