707. リンクされたリストを設計するための問題解決のアイデア

707. リンクされたリストを設計するための問題解決のアイデア

ここに画像の説明を挿入

1. アイデア

1.注意事項:リンクリストの設計で区別する最も重要なことは、リンクリストのサイズとインデックス値インデックスの関係です(下図を参照)、特にノードを追加する場合は、いつ考慮する必要がありますインデックス値は 0 で、連結リストの長さは 0 (連結リストが空) です
ここに画像の説明を挿入
2. 連結リストノード挿入関数の分類に関する議論: (連結リストが空で、インデックス値が 0 の場合を考慮する必要があるのはなぜですか? ブロガーのコード設計では、ループ終了条件がインデックス値であるためです。マイナス 1 であり、終了条件をマイナスの数にすることはできません。)

  • インデックス値が 0 未満です
  • インデックス値が連結リストの長さを超えています (無効な挿入)
  • インデックス値はリンク リストの長さと同じです (リンク リストは空です。リンク リストは空ではありません)。
  • インデックス値がリンク リストの長さ未満です (インデックス値は 0 です。インデックス値は 0 ではありません)。

3. 参考記事:クリックすると記事「データ構造の基本アルゴリズム(Python版)」が開き、Pythonの連結リスト構造の設計が理解できる

# 设计一个通用链节点的类
class ListNode:
    def __init__(self,val=0,next=None):
        self.val = val
        self.next = next
# 设计链表的类
class MyLinkedList:

    def __init__(self): # 链表初始化
        self.size = 0 # 链表长度
        self.head = ListNode(0) # 头节点

    def get(self, index: int) -> int:
        if index < 0 or index >= self.size: # 索引无效,获取链表节点值时链表值不能等于链表长度,但是下面插入函数可以请注意
            return -1
        else:
            temp = self.head
            for _ in range(index):
                temp = temp.next
            return temp.val

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


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


    def addAtIndex(self, index: int, val: int) -> None:
        if index < 0: # 索引值小于0,在链表头部插入节点
            tail = self.head
            temp = ListNode(val)
            temp.next = tail
            self.head = temp
            self.size += 1
        elif index > self.size: # 索引值大于链表长度,无效
            pass
        elif index == self.size: # 索引值等于链表长度
            if self.size == 0: # 链表为空,直接在头部插入
                tail = self.head
                temp = ListNode(val)
                temp.next = tail
                self.head = temp
                self.size += 1
            else: # 链表不为空,链节点插入链表尾部
                tail = self.head
                temp = ListNode(val)
                for _ in range(index-1):
                    tail = tail.next
                tail.next = temp
                self.size += 1
        else: # 索引值不等于链表长度
            if index == 0: # 索引值为0,在链表头部插入链节点
                tail = self.head
                temp = ListNode(val)
                temp.next = tail
                self.head = temp
                self.size += 1
            else: # 索引值不为0,在index的节点之前插入新的链节点
                tail = self.head
                for _ in range(index-1):
                    tail = tail.next
                temp = ListNode(val)
                temp.next = tail.next
                tail.next = temp
                self.size += 1


    def deleteAtIndex(self, index: int) -> None:
        if index >= 0 and index < self.size: # 索引值有效的情况下进行链节点删除
            if index == 0: # 删除头节点
                self.head = self.head.next
                self.size -= 1
            elif index == self.size - 1: # 删除尾节点
                tail = self.head
                for _ in range(self.size - 2):
                    tail = tail.next
                tail.next = None
                self.size -= 1
            else: # 删除中间节点
                tail = self.head
                for _ in range(index-1):
                    tail = tail.next
                temp = tail.next.next
                tail.next = temp
                self.size -= 1


# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

おすすめ

転載: blog.csdn.net/rothschild666/article/details/129418598