首先是链表类的定义,但类是什么?
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
这里定义了一个ListNode类,即你可以用这个类来设置一系列的实例都满足这个类里的函数或者其它。def 函数里必须有self.
self.head = ListNode(0)
即你创造了一个实例self.head,你可以运用里面的.val和.next,相当于把self替换成了self.head。
def create(self, data):
self.head = ListNode(0)#是的,只要传一个value值,相当于self.head = ListNode(0, None)
cur = self.head#注意,创建一个变量cur,初始值为self.head,用来追踪当前节点的位置,就是所谓的指针。这时cur也是一个listNode类型了。当时没在意以至于后面一直在思考为什么cur会有,next的用法
for i in range(len(data)):
node = ListNode(data[i])#显而易见最后一个node的next值是None
cur.next = node
cur = cur.next
#事实上还是会被高中的列表误导拉
这里便是链表的生成式了。想解释的话都在注释中。
def 函数里必须有self.
可以把cur当作一个列表,储存的值为当前节点,可以使用.next和.val。即使这段代码并没有涉及到通过列表建立链表.
并且
self.head = ListNode(0)
使这个链表的头节点self.head(即head)指向第一个节点并不为空,而是一个value为0的节点,这个原因是因为避免删除节点时就不用再判断头节点是否为空了。只要注意最后从head.next输出即可
class singly_linked_list:
def __init__(self):
#初始化链表
self.size = 0
self.head = ListNode(0)
def create(self, data):
cur = self.head#既然你加了初始化链表的函数,这里就不需要再self.size=0;同理若删去初始化链表,这里就要加上self.size=0
for i in range(len(data)):
node = ListNode(data[i])
cur.next = node
cur = cur.next
在第二个注释这里卡了一会儿,搞不懂为什么输出结果为空。
class singly_linked_list:
def __init__(self):
#初始化链表
self.size = 0
self.head = ListNode(0)
def get(self, index):
cur = self.head
if index < 0 or index > self.size - 1:
return -1
curr = self.head
for i in range(index + 1):
curr = curr.next
return curr.val
这里对self.size=0和下面get函数疑惑了一下,不就是0吗?事实上的确需要先初始化一个链表,并在循环中让self.size+=1,其为链表长度。
def __str__(self):
cur = self.head.next
elements = []
while cur is not None:
elements.append(str(cur.val))
cur = cur.next
return " -> ".join(elements)
link = singly_linked_list()
link.create([2, 3, 5, 1, 6])
print(link)
这样就可以输出link中的值了,如果删除def __str__,print函数只会输出个地址。
之后便是链表中的排序和双指针了。几乎和数组差不多,只不过指针更多是用while node_i,其实只要给出self.size就可以用for循环了。
sorted_list.next = cur.next
cur.next = prev.next
prev.next = cur
这里的插入排序其实也要思考,相当于把cur指向prev指针 而prev指针指向了cur,这里与中间插入节点类似。
node_i.val, min_node.val = min_node.val, node_i.val
node_j.val, node_j.next.val = node_j.next.val, node_j.val
这里也不同于冒泡排序和选择排序的直接进行值的交换。(为什么?可能是因为二者都是一边的排序,而插入排序需要重新再排)