day3 ListNode

用链表的目的是什么?省空间还是省时间? - 知乎

 

链表只是区别于数组的一种数据结构,明显的区别是有链接。

学链表的目的是为了让你自己设计合适的数据处理结构。 

203 移除链表元素

dummy_head统一删除方式

cur设置临时指针,用于操作,这个临时指针起始是dummy_head

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        dummy_head = ListNode(next = head)
        cur = dummy_head
        while(cur.next!= None):
            if (cur.next.val == val):
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummy_head.next

707 还需要把代码中的head改成dummy更好理解

# 先构造Node结构,包括数值和指针, val, next 为链表结构专有概念,不需要定义也能直接调用。val 赋值0, next赋值为None。

class Node:

    def __init__(self, x = 0):

        self.val = x

        self.next = None

#构造链表,定义头结点

class MyLinkedList:

    def __init__(self):

        self.head = Node()

        self.size = 0 # 设置一个链表长度的属性,便于后续操作,注意每次增和删的时候都要更新


 

    def get(self, index: int) -> int:

        if index < 0 or index >= self.size:

            return -1

        cur = self.head.next

        while(index):

            cur = cur.next

            index -= 1

        return cur.val


 

    def addAtHead(self, val: int) -> None:

        new_node = Node(val)

        new_node.next = self.head.next # 先指向头结点的下一个,这时候这个链接还没断

        self.head.next = new_node #再让head指向new node, head就是这个程序里的虚拟结点

        self.size += 1


 

    def addAtTail(self, val: int) -> None:

        new_node = Node(val)

        cur = self.head

        while(cur.next):# cur不会none,就继续遍历

            cur = cur.next

        cur.next = new_node

        self.size += 1


 

    def addAtIndex(self, index: int, val: int) -> None:

        if index <= 0: # 如果index小于等于0,那么就是说在前面插入,和你自己有没有设置dummyhead无关。等于0的情况,因为有dummyhead, 下面集中处理的代码里包含了,所以这里可以不等于。

            self.addAtHead(val)

            return

        elif index == self.size: # 最大的index是size - 1

            self.addAtTail(val)

            return

        elif index > self.size: # 不插入

            return

        node = Node(val)

        pre = self.head #定义pre为辅助指针

        while(index): #这里考虑了dummyhead,带入简单的数字验证就会明白

            pre = pre.next

            index -= 1

        node.next = pre.next

        pre.next = node

        self.size += 1


 

    def deleteAtIndex(self, index: int) -> None:

        if index < 0 or index >= self.size:

            return

        pre = self.head

        while(index): # 跟上边一样

            pre = pre.next

            index -= 1

        pre.next = pre.next.next

        self.size -= 1

   206 递归写法真是骚啊,不怎么妙,但是骚。基于双指针写法的原理来搞的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值