链表以类的方式

首先是链表类的定义,但类是什么?

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

这里也不同于冒泡排序和选择排序的直接进行值的交换。(为什么?可能是因为二者都是一边的排序,而插入排序需要重新再排)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值