------リンクリストデータ構造
PS:パニックに休日のアイドル。。比較の基準についての思考を学び、実用的なものは、ストロークを撫でも、それがどのような検討する機会取る
テキストが始まった:
リストは、線形データ構造であり、リストの各要素が値を持つノードとして理解することができるが、だけでなく、アレイよりゆっくりアクセスデータへのインデックスが、削除のリストに比べて、:そこでは各ノードにフィールド参照は、(ポインタ値+つまり、このノードは2つの部分で構成され、次の要素へのポインタとして理解されるべきで)一緒に連結しますそして、それは便利である側面を挿入し、一般的なリストは、シングルとダブルリンクリストに分割されています。
単一のリスト
以下の機能:
し1.Get(インデックス):ノードのリスト内のインデックスの値を取得します。インデックスが無効である場合には-1を返し、
2 addAtHead(ヴァル):リストの最初の要素の前にヴァルにノードを追加します。挿入後、新しいノードがリストの最初のノードとなり、
3 addAtTail(ヴァル)は:リストの最後の要素にvalをノードに追加され、
4 addAtIndex(インデックス、ヴァル):のリスト内の最初のインデックスヴァルノードにノードを追加する前に。インデックスは、リストの長さに等しい場合、ノードはリストの最後に追加されます。インデックスは、リストの長さより大きい場合、ノードが挿入されません。インデックスが0未満である場合、ノードは、ヘッドに挿入される。
5. deleteAtIndex(率):実効屈折率インデックスは、インデックスノードのリストを削除した場合、
アイコン:
コードは以下の通りであります:
class Node(object):
def __init__(self, x):
self.val = x
self.next = None
class MyLinkedList:
def __init__(self):
self.size = 0
self.head = Node(0)
def get(self, index: int) -> int:
if index < 0: return -1
node = self.head
for _ in range(index + 1):
if node.next is not None:
node = node.next
else:
return -1
return node.val
def addAtHead(self, val: int) -> None:
self.size += 1
p = Node(val)
p.next = self.head.next
self.head.next = p
def addAtTail(self, val: int) -> None:
self.size += 1
cur = self.head
while cur.next is not None:
cur = cur.next
cur.next = Node(val)
def addAtIndex(self, index: int, val: int) -> None:
self.size += 1
cur = self.head
for i in range(index):
if cur.next is None:
return
cur = cur.next
if cur is Node:
cur = Node(val)
else:
new = Node(val)
new.next = cur.next
cur.next = new
def deleteAtIndex(self, index: int) -> None:
cur = self.head
if index < 0: return
for i in range(index):
cur = cur.next
if cur.next is not None:
cur.next = cur.next.next
self.size -= 1
次のようにテストは以下のとおりです。
obj = MyLinkedList()
obj.addAtHead(1)
obj.addAtTail(3)
obj.addAtIndex(1,2) #链表变为1-> 2-> 3
print(obj.get(1)) #返回2
obj.deleteAtIndex(1) #现在链表是1-> 3
print(obj.get(1)) #返回3
print(obj.head.next.val)
print(obj.head.next.next.val) #链表的头节点一般为空
print(obj.size)
結果は以下の通りである:
[画像]
二重リンクリスト
アイコン:
次のようにコードは次のとおりです。
def __init__(self,x):
self.val = x
self.next = None
self.prev = None
class MyLinkedList:
def __init__(self):
self.size = 0
self.head = Node(0)
self.tail = Node(0)
self.head.next = self.tail
self.tail.prev = self.head
def get(self, index: int) -> int:
if index<0 or index>=self.size:
return -1
if index + 1 < self.size - index: #双向链表的话只要需要索引,这个地方可以选择最近的一边进行查找,仅对此函数操作一下
node = self.head
for i in range(index+1):
node = node.next
else:
node = self.tail
for i in range(self.size - index):
node = node.prev
return node.val
def addAtHead(self, val: int) -> None:
one,two = self.head,self.head.next
p = Node(val)
p.next = two
p.prev = one
one.next = p
two.prev = p
self.size += 1
def addAtTail(self, val: int) -> None:
one,two = self.tail,self.tail.prev
p = Node(val)
p.next = one
p.prev = two
one.prev = p
two.next = p
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
if index > self.size:
return
if index < 0:
index = 0
l = self.head
for i in range(index):
l = l.next
r = l.next
self.size += 1
p = Node(val)
p.next = r
p.prev = l
l.next = p
r.prev = p
def deleteAtIndex(self, index: int) -> None:
if index >= self.size or index < 0:
return
l = self.head
for i in range(index):
l = l.next
r = l.next.next
self.size -= 1
l.next = r
r.prev = l
私はこの缶の変化の背後に何かを聞いたことありますか?ことは、最初のように、さらなる改善のための新しいアイデアを何後。。