データ構造のリンクリストの実装


------リンクリストデータ構造

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
     

私はこの缶の変化の背後に何かを聞いたことありますか?ことは、最初のように、さらなる改善のための新しいアイデアを何後。

出版元の記事 ウォンの賞賛0 ビュー74

おすすめ

転載: blog.csdn.net/jsibdhdbjsninsjs/article/details/104023440