• 代码随想录一一一链表一一一设计链表


    题目来源自leetcode与代码随想录

    (1)707.设计链表

    题目描述:
    在链表类中实现这些功能:
    get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。

    addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。

    addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。

    addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。

    deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

    (1)单向链表

    class ListNode:
        def __init__(self, x):
            self.val = x
            self.next = None
    
    class MyLinkedList(object):
    
        def __init__(self):
            self.size = 0
            self.head = ListNode(0)
    
        def get(self, index):
            if index < 0 or index >= self.size:
                return -1
    
            cur = self.head
            
            for _ in range(index + 1):
                cur = cur.next
            
            return cur.val
    
        def addAtIndex(self, index, val):
            if index > self.size:
                return
            
            if index < 0:
                index = 0
    
            self.size += 1
    
            pred = self.head
            for _ in range(index):
                pred = pred.next
    
            toAddNode = ListNode(val)
            toAddNode.next = pred.next
            pred.next = toAddNode
    
        def addAtHead(self, val):
            self.addAtIndex(0, val)
    
        def addAtTail(self, val):
            self.addAtIndex(self.size, val)
    
        def deleteAtIndex(self, index):
            if index >= self.size or index < 0:
                return
            
            self.size -= 1
            predDel = self.head
            
            for _ in range(index):
                predDel = predDel.next
    
            predDel.next = predDel.next.next
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    (2)双向链表

    # 双链表
    # 相对于单链表, Node新增了prev属性
    class Node:
        
        def __init__(self, val):
            self.val = val
            self.prev = None
            self.next = None
    
    class MyLinkedList:
    
        def __init__(self):
            self._head, self._tail = Node(0), Node(0)  # 虚拟节点
            self._head.next, self._tail.prev = self._tail, self._head
            self._count = 0  # 添加的节点数
    
        def _get_node(self, index: int) -> Node:
            # 当index小于_count//2时, 使用_head查找更快, 反之_tail更快
            if index >= self._count // 2:
                # 使用prev往前找
                node = self._tail
                for _ in range(self._count - index):
                    node = node.prev
            else:
                # 使用next往后找
                node = self._head   
                for _ in range(index + 1):
                    node = node.next
            return node
    
        def get(self, index: int) -> int:
            if 0 <= index < self._count:
                node = self._get_node(index)
                return node.val
            else:
                return -1
    
        def addAtHead(self, val: int) -> None:
            self._update(self._head, self._head.next, val)
    
        def addAtTail(self, val: int) -> None:
            self._update(self._tail.prev, self._tail, val)
    
        def addAtIndex(self, index: int, val: int) -> None:
            if index < 0:
                index = 0
            elif index > self._count:
                return
            node = self._get_node(index)
            self._update(node.prev, node, val)
    
        def _update(self, prev: Node, next: Node, val: int) -> None:
            # 计数累加
            self._count += 1
            node = Node(val)
            prev.next, next.prev = node, node
            node.prev, node.next = prev, next
    
        def deleteAtIndex(self, index: int) -> None:
            if 0 <= index < self._count:
                node = self._get_node(index)
                # 计数-1
                self._count -= 1
                node.prev.next, node.next.prev = node.next, node.prev
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    变电站远程监控维护,工程师不用出差跑断腿
    [开发浏览器实战]关于Firefox火狐浏览器的说明一二(国内版 国际版区别 账号切换 插件-恢复关闭的标签页 插件-tempermonkey油猴)
    USB转串口芯片沁恒微CH9340
    外汇天眼:Patrick Wonsey挪用340万美元!涉嫌外汇和二元期权欺诈
    设计模式系列之MVC模式
    (LeetCode)全排列
    毕设 JAVA JSP教师信息管理系统论文
    并发模式之生产者消费者模式
    Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)
    一种使用wireshark快速分析抓包文件amr音频流的思路方法
  • 原文地址:https://blog.csdn.net/qq_35668477/article/details/126293102