上篇进行了初识链表、构造链表、打印链表、append、pop,链接如下:
python数据结构 —— 链表(上)
本篇将介绍链表的prepend、pop first 、get和set
6.prepend —— 将结点添加到链表前面
首先应该讨论链表的长度是否为零,如果链表的长度为零,则相当于创建一个链表。如果链表长度不为零,则需要一个head
结点,通过head
的由原来的头结点移动到新结点的过程完成新结点的添加。
def prepend(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
new_node.next = self.head
self.head = new_node
self.length += 1
return True
将链表长度不为零的过程可视化如下:
- 下面的代码是一个完整过程示例:
class Node:
def __init__(self,value):
self.value = value
self.next = None
class LinkedList:
def __init__(self,value):
new_node = Node(value)
self.head = new_node
self.tail = new_node
self.length = 1
def print_list(self):
temp = self.head
while temp is not None:
print(temp.value)
temp = temp.next
def append(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
self.tail = new_node
self.length += 1
def prepend(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
new_node.next = self.head
self.head = new_node
self.length += 1
return True
my_linked_list = LinkedList(2)
my_linked_list.append(3)
my_linked_list.prepend(1)
my_linked_list.print_list()
运行的输出结果如下:
1
2
3
7.pop first —— 删除第一个节点
涉及到删除的内容,我们需要考虑链表的长度。(1)链表长度为0,谈不上任何删除操作;(2)链表长度不为零,利用head
和temp
新结点,利用.next = None
的操作把结点之间的连接箭头断开。
def pop_first(self):
if self.length == 0:
return None
temp = self.head
self.head = self.head.next
temp.next = None
self.length -= 1
if self.length == 0:
self.tail = None
return temp
如果链表长度不为零,将pop first的过程可视化
利用self.head = self.head.next
一句,将head结点往后移
利用temp.next = None
将两个节点之间的箭头断掉,完成删除第一个结点过程
- 下面的代码是一个完整过程示例:
class Node:
def __init__(self,value):
self.value = value
self.next = None
class LinkedList:
def __init__(self,value):
new_node = Node(value)
self.head = new_node
self.tail = new_node
self.length = 1
def print_list(self):
temp = self.head
while temp is not None:
print(temp.value)
temp = temp.next
def append(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
self.tail = new_node
self.length += 1
def pop_first(self):
if self.length == 0:
return None
temp = self.head
self.head = self.head.next
temp.next = None
self.length -= 1
if self.length == 0:
self.tail = None
return temp.value
my_linked_list = LinkedList(2)
my_linked_list.append(3)
# 2 items - return 2 node
print(my_linked_list.pop_first())
# 1 items - return 1 nodes
print(my_linked_list.pop_first())
# 0 items - return none
print(my_linked_list.pop_first())
输出结果如下:
2
3
None
8.get —— 通过索引找到结点的值
本实现需要引入index
索引,索引的数值从0开始。索引最大值=长度-1,所以索引值不能为负,也不可以大于等于长度值
def get(self,index):
if index < 0 or index >= self.length:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
上面代码中的_
是一个常见的变量名,通常用作占位符。
-
补充
-
range()
是一个内置函数,用于生成一系列连续的整数,语法如下:
range(start,end,stop)
中start指的是计数起始值,默认是0;stop指的是计数结束值,但不包括stop;step是步长,默认为1,不可以为0。 -
使用range()函数的时候,如果只有一个参数,就表示end,从0开始;如果有两个参数,就表示start和end;如果有三个参数,最后一个就表示步长。注意其接受的必须是整数。
-
下面的代码是一个完整过程示例:
class Node:
def __init__(self,value):
self.value = value
self.next = None
class LinkedList:
def __init__(self,value):
new_node = Node(value)
self.head = new_node
self.tail = new_node
self.length = 1
def print_list(self):
temp = self.head
while temp is not None:
print(temp.value)
temp = temp.next
def append(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
self.tail = new_node
self.length += 1
def get(self,index):
if index < 0 or index >= self.length:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp.value
my_linked_list = LinkedList(0)
my_linked_list.append(1)
my_linked_list.append(2)
my_linked_list.append(3)
# my_linked_list.print_list()
print(my_linked_list.get(2))
print(my_linked_list.get(0))
运行后的结果如下:
2
0
如果要找索引为2的结点的值,将过程可视化如下:
其实上面的过程相当于temp
结点移动“index”值多少步。如上例所示,index为2,那我相当于移动2步,找到的结点值为2。
9.set —— 设置结点的值
要设置结点的值,首先应该先找到结点所在的位置——>索引,所以会调用上面所提及的get
函数,将我所要更改的结点的值赋给temp
结点,即可完成设置。
def set_value(self,index,value):
temp = self.get(index)
if temp:
temp.value = value
return True
return False
- 下面的代码是一个完整过程示例:
class Node:
def __init__(self,value):
self.value = value
self.next = None
class LinkedList:
def __init__(self,value):
new_node = Node(value)
self.head = new_node
self.tail = new_node
self.length = 1
def print_list(self):
temp = self.head
while temp is not None:
print(temp.value)
temp = temp.next
def append(self,value):
new_node = Node(value)
if self.length == 0:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
self.tail = new_node
self.length += 1
def get(self,index):
if index < 0 or index >= self.length:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def set_value(self,index,value):
temp = self.get(index)
if temp:
temp.value = value
return True
return False
my_linked_list = LinkedList(11)
my_linked_list.append(3)
my_linked_list.append(23)
my_linked_list.append(7)
my_linked_list.print_list()
my_linked_list.set_value(1,4)
print("after set -----------")
my_linked_list.print_list()
运行后的结果如下:
11
3
23
7
after set -----------
11
4
23
7