LeetCode | 707デザインリスト

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

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

get(index):インデックス・ノードのリストの値を取得します。インデックスが無効の場合は、-1が返されます。
addAtHead(val):リンクされたリストの最初の要素の前に値を追加するvalノード。挿入後、新しいノードは、リストの最初のノードになります。
addAtTail(val):ヴァルへのノードは、リストの最後の要素に追加しました。
addAtIndex(index,val):最初のリンクリストのノードインデックスの前に値を追加するvalノード。インデックスは、リストの長さに等しい場合、ノードはリストの最後に追加されます。インデックスは、リストの長さより大きい場合、ノードが挿入されません。インデックスが0未満である場合、そのノードは、ヘッドに挿入されます。
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

ヒント:

  • すべてのval値は、$の$ [1、1000年]です。
  • $ [1、1000年]内の$での操作の数。
  • ビルトインは使用しないでくださいLinkedListライブラリを。

コード

struct myListNode
{
    int val;
    myListNode* next;
    myListNode() :val(-1), next(nullptr) {}
};


class MyLinkedList {
public:
    int m_size;
    myListNode* m_head;
    myListNode* m_tail;
    
public:
    /** Initialize your data structure here. */
    MyLinkedList() :m_size(0)
    {
        m_head = new myListNode();
    }

    /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
    int get(int index)
    {
        if (index > m_size - 1 || index < 0)
        {
            return -1;
        }
        myListNode* p = m_head->next;
        while (index != 0)
        {
            p = p->next;
            --index;
        }
        //std::cout << p->val;
        return p->val;
    }

    /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
    void addAtHead(int val)
    {
        myListNode* newNode = new myListNode();
        newNode->next = m_head->next;
        m_head->next = newNode;
        newNode->val = val;
        m_size += 1;
    }

    /** Append a node of value val to the last element of the linked list. */
    void addAtTail(int val)
    {
        myListNode* lastNode = new myListNode();
        lastNode->val = val;
        myListNode* p = m_head;
        int len = m_size;
        while (len != 0)
        {
            p = p->next;
            --len;
        }
        p->next = lastNode;
        lastNode->next = NULL;
        m_size += 1;
    }

    /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
    void addAtIndex(int index, int val)
    {
        if (index > m_size) return;
        if (index == m_size)
        {
            addAtTail(val);
            return;
        }
        if (index < 0)
        {
            addAtHead(val);
            return;
        }
        myListNode* newNode = new myListNode();
        myListNode* p = m_head;
        while (index != 0)
        {
            p = p->next;
            --index;
        }
        newNode->next = p->next;
        p->next = newNode;
        newNode->val = val;
        m_size += 1;
    }

    /** Delete the index-th node in the linked list, if the index is valid. */
    void deleteAtIndex(int index)
    {
        if (index > m_size - 1 || index < 0) return;
        myListNode* p = m_head;
        while (index != 0)
        {
            p = p->next;
            --index;
        }
        myListNode* delNode = p->next;;
        p->next = p->next->next;
        m_size -= 1;
        delete delNode;
    }
};

おすすめ

転載: www.cnblogs.com/Kanna/p/12513708.html