バグを書くのが大好き(ID:iCodeBugs)
デザインのリストを実装します。あなたは、単一または二重リンクリストを使用するように選択することができます。リスト内の1つのノードには、2つのプロパティを持つ必要がありますval
とnext
。val
これは、ノードの現在の値であるnext
次のノード/参照を指し示すポインタです。二重リンクリストを使用するには、属性も必要ですprev
リンクリスト内のノードを示すために。リスト内のすべてのノードが0インデックスされていると仮定します。
リストクラスでこれらの機能を実装します:
- (インデックス)を取得:のリストを取得
index
ノードの値を。インデックスが無効なリターンがある場合-1
。 - addAtHead(ヴァル):リンクされたリストの最初の要素の前に値を追加する
val
ノード。挿入後、新しいノードは、リストの最初のノードになります。 - addAtTail(ヴァル):値
val
ノードのは、リストの最後の要素に追加されます。 - addAtIndex(インデックス、ヴァル):リスト内の最初の
index
ノードの前に追加されval
たノード。場合はindex
、リストの長さに等しく、ノードはリストの最後に追加されます。場合はindex
、リストの長さよりも大きい、ノードが挿入されません。 - deleteAtIndex(インデックス):インデックスが場合に
index
有効である、最初のリストの削除index
ノードを。
リンクリストの実装を設計します。あなたは、単独で、リンクされたリストまたは二重リンクリストを使用するように選択することができます。単独リンクリスト内のノードは、次の2つの属性を持っている必要がありますval
とnext
。val
現在のノードの値であり、next
次のノードへのポインタ/参照です。あなたが二重にリンクされたリストを使用したい場合は、1以上の属性が必要になりますprev
リンクリスト内の前のノードを示すために。リンクリスト内のすべてのノードがあると仮定0をインデックス。
あなたのリンクリストクラスでこれらの機能を実装します。
- (インデックス)を取得:の値を取得
index
リンクリストで番目のノードを。インデックスが無効な場合、返します-1
。 - addAtHead(ヴァル):値のノードを追加し
val
、リンクされたリストの最初の要素の前に。挿入後、新しいノードは、リンクされたリストの最初のノードになります。 - addAtTail(ヴァル):値のノードを追加
val
リンクされたリストの最後の要素です。 - addAtIndex(インデックス、ヴァル):値のノードを追加
val
する前にindex
、リンクされたリスト内番目のノード。場合index
リンクされたリストの長さに等しく、ノードは、リンクされたリストの最後に追加されるであろう。インデックスが長さよりも大きい場合、ノードが挿入されません。 - deleteAtIndex(インデックス):削除し
index
たインデックスが有効な場合、リンクリストで番目のノードを。
例:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3
ヒント:
- すべての値がある
[1, 1000]
範囲内。 - 操作の数になります
[1, 1000]
以内。 - LinkedListのビルトインライブラリを使用しないでください。
問題解決のアイデア:
図を見てください:
- 単独リンクリストの追加操作
私たちが望む場合は与えられたノードはprev
、新しい値の後に追加され、我々はすべきです:
- 与えられた新しいノードの値を初期化します
cur;
- なります
cur
前にリンクされている次のノードの「次」のフィールドnext
。 - される
prev
「次」フィールドがにリンクされていますcur
。
- 最初のノードを削除します
我々は最初のノードを削除したい場合は、ポリシーが異なることになります。
前述したように、我々は最初のノードを使用してhead
リストを示すために。私達の頭部は、以下の例では黒色ノード23です。
あなたが最初のノードを削除したい場合は、単純にすることができます将下一个结点分配给 head
。それはノード6になります私たちの頭を削除した後、あります。
リストノードは、ゼロからスタートしないので、ノード23は、私たちのリストにはもはやあります。
中国LeetCodeの公式サイトからの写真
高レベルのプログラミング言語は、一般的に内蔵されたリストを持って、この質問は、LinkedListのライブラリを使用することはできませんArrayListを、リストや他のデータ構造ソリューション、非常に面白い、トピックに多くを見る、再生リストを作ることですが、LinkedListのは継承されますArrayListを、リスト,,これら2つのライブラリを直接使用することは意味がありませんでした。実際には、原則としては、リンクリストのようなものであるかのプロジェクトが本当に実際には基本的にこれらの事を見つけるためになっているとき、基本的な構造の性能を最適化するためのステップのリストを書き換える必要がある場合、高レベルの言語は、優れたパッケージリストを持って理解しています。
Javaの:
class Node {//定义Node
int val;
Node next;
Node(int val) {
this.val = val;
this.next = null;
}
}
class MyLinkedList {
Node head;//头
Node tail;//尾
int size = 0;//链表长度
public MyLinkedList() {//初始化数据
head = new Node(0);//为了方便初始化一个本不存在的head,值为0
tail = head;//初始下尾也指向和头同一个对象
size = 0;
}
public int get(int index) {
if (index >= size || index < 0) {//index不在查找区间返回-1
return -1;
}
Node cur = head;
for (int i = 0; i <= index; i++) {//从head一个一个向下遍历,到index
cur = cur.next;
}
return cur.val;//返回值
}
public void addAtHead(int val) {
Node temp = head.next;//temp对象是真实链表的第一个节点(因为head一直是初始化的 0 )
head.next = new Node(val);//构造的虚拟节点head的下一个节点指向新插入的节点
head.next.next = temp;//新插入节点指向原本第一个真实节点
size++;//计数
if (size == 1) {
tail = head.next;//如果只有一个节点此时尾节点也指向新加入的节点
}
}
public void addAtTail(int val) {//添加尾节点
tail.next = new Node(val);//把尾节点下一个对象指向新加入节点即可
tail = tail.next;//刷新尾节点为新加入的节点
size++;
}
public void addAtIndex(int index, int val) {
if (index > size) {//插入值不在范围直接返回。
return;
}
Node cur = head;//当前节点从头节点开始
for (int i = 0; i < index; i++) {//遍历到 插入位置的前一个节点 因为要求是插入到index的前面
cur = cur.next;
}
Node temp = cur.next;//暂存当前节点的下一个节点
cur.next = new Node(val);//把当前节点下一个对象指向新节点
if (index == size) {
tail = cur.next;//如果插入位置刚好是最后一个则把尾节点指向新加入节点
}
cur.next.next = temp;//新节点的下一个节点指向暂存节点位置
size++;
}
public void deleteAtIndex(int index) {
if (index >= size || index < 0) {
return;
}
Node cur = head;//从头节点遍历到index目标节点的前一个节点 因为要删除目标节点
for (int i = 0; i < index; i++) {
cur = cur.next;
}
cur.next = cur.next.next;//目标节点前一个节点的下一个节点指向目标节点的下一个节点
size--;//刷新节点数量
if (cur.next == null) {
tail = cur;
}
}
}
python3:
class Node:
def __init__(self, val, _next=None):
self.next = _next
self.val = val
class MyLinkedList:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def get(self, index: int) -> int:
if index > self.size - 1 or index < 0:
return -1
node = self.head
for i in range(index):
node = node.next
return node.val
def addAtHead(self, val: int) -> None:
node = Node(val, self.head)
self.head = node
if self.size == 0:
self.tail = node
self.size = self.size + 1
def addAtTail(self, val: int) -> None:
node = Node(val)
if self.size == 0:
self.head = self.tail = node # 原链表为空时,添加新节点后,更新链表的头指针和尾指针为新增节点。
else:
self.tail.next = node # 原链表不为空时,使原尾指针指向新节点,即可将新节点添加至原链表尾部
self.tail = node # 更新尾指针
self.size = self.size + 1 # 更新此时链表的长度
def addAtIndex(self, index: int, val: int) -> None:
node = Node(val)
if index > self.size:
return
if index <= 0:
return self.addAtHead(val) # index 小于等于0都默认为头指针后添加节点
if index == self.size: # 如果index等于链表的长度添加尾指针后添加节点
return self.addAtTail(val)
prev = self.head # 第一个节点对象开始遍历
for i in range(index - 1):
prev = prev.next
temp = prev.next
prev.next = node
node.next = temp
self.size = self.size + 1
def deleteAtIndex(self, index: int) -> None:
if index < 0 or index >= self.size:
return
prev = self.head
if index == 0:
self.head = self.head.next
self.size = self.size - 1
return
for i in range(index - 1):
prev = prev.next
if index == self.size - 1:
self.tail = prev
prev.next = prev.next.next
self.size = self.size - 1
いいえ国民は:バグを書くのが大好きない(ID:iCodeBugs)