LeetCode707:デザイン一覧デザインリンクリスト

バグを書くのが大好き(ID:iCodeBugs)

デザインのリストを実装します。あなたは、単一または二重リンクリストを使用するように選択することができます。リスト内の1つのノードには、2つのプロパティを持つ必要がありますvalnextvalこれは、ノードの現在の値であるnext次のノード/参照を指し示すポインタです。二重リンクリストを使用するには、属性も必要ですprevリンクリスト内のノードを示すために。リスト内のすべてのノードが0インデックスされていると仮定します。

リストクラスでこれらの機能を実装します:

  • (インデックス)を取得:のリストを取得indexノードの値を。インデックスが無効なリターンがある場合-1
  • addAtHead(ヴァル):リンクされたリストの最初の要素の前に値を追加するvalノード。挿入後、新しいノードは、リストの最初のノードになります。
  • addAtTail(ヴァル):値valノードのは、リストの最後の要素に追加されます。
  • addAtIndex(インデックス、ヴァル):リスト内の最初のindexノードの前に追加されvalたノード。場合はindex、リストの長さに等しく、ノードはリストの最後に追加されます。場合はindex、リストの長さよりも大きい、ノードが挿入されません。
  • deleteAtIndex(インデックス):インデックスが場合にindex有効である、最初のリストの削除indexノードを。

リンクリストの実装を設計します。あなたは、単独で、リンクされたリストまたは二重リンクリストを使用するように選択することができます。単独リンクリスト内のノードは、次の2つの属性を持っている必要がありますvalnextval現在のノードの値であり、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、新しい値の後に追加され、我々はすべきです:

  1. 与えられた新しいノードの値を初期化します cur;IMG
  2. なりますcur前にリンクされている次のノードの「次」のフィールドnextIMG
  3. されるprev「次」フィールドがにリンクされていますcurIMG
  • 最初のノードを削除します

我々は最初のノードを削除したい場合は、ポリシーが異なることになります。

前述したように、我々は最初のノードを使用してheadリストを示すために。私達の頭部は、以下の例では黒色ノード23です。

IMG

あなたが最初のノードを削除したい場合は、単純にすることができます将下一个结点分配给 headそれはノード6になります私たちの頭を削除した後、あります。

IMG

リストノードは、ゼロからスタートしないので、ノード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)

私はbug.pngを書くのが大好き

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/11183478.html