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)