1. 程式人生 > >Leetcode707.Design Linked List設計連結串列

Leetcode707.Design Linked List設計連結串列

設計連結串列的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val 和 next。val 是當前節點的值,next 是指向下一個節點的指標/引用。如果要使用雙向連結串列,則還需要一個屬性 prev 以指示連結串列中的上一個節點。假設連結串列中的所有節點都是 0-index 的。

在連結串列類中實現這些功能:

  • get(index):獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1。
  • addAtHead(val):在連結串列的第一個元素之前新增一個值為 val 的節點。插入後,新節點將成為連結串列的第一個節點。
  • addAtTail(val):將值為 val 的節點追加到連結串列的最後一個元素。
  • addAtIndex(index,val):在連結串列中的第 index 個節點之前新增值為 val  的節點。如果 index 等於連結串列的長度,則該節點將附加到連結串列的末尾。如果 index 大於連結串列長度,則不會插入節點。
  • deleteAtIndex(index):如果索引 index 有效,則刪除連結串列中的第 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 庫。

 

 

struct Node
{
    int val;
    Node* next;
    Node(int x) : val(x), next(NULL)
    {
    }
};

class MyLinkedList {
public:
    Node *head;
    int cnt;
    MyLinkedList() {
        head = NULL;
        cnt = 0;
    }

    int get(int index) {
        if(index < 0 || index > cnt - 1)
            return -1;
        Node* temp = head;
        while(index)
        {
            temp = temp ->next;
            index--;
        }
        return temp ->val;
    }

    void addAtHead(int val)
    {
        Node* node = new Node(val);
        if(cnt == 0)
        {
            head = node;
        }
        else
        {
            node ->next = head;
            head = node;
        }
        cnt++;
    }

    void addAtTail(int val)
    {
        Node* node = new Node(val);
        if(cnt == 0)
        {
            head = node;
        }
        else
        {
            Node *temp = head;
            while(temp ->next != NULL)
            {
                temp = temp ->next;
            }
            temp ->next = node;
        }
        cnt++;
    }

    void addAtIndex(int index, int val) {
        if(index < 0 || index > cnt)
            return;
        if(index == 0)
        {
            addAtHead(val);
        }
        else if(index == cnt)
        {
            addAtTail(val);
        }
        else
        {
            Node* temp = head;
            Node* node = new Node(val);
            while(index > 1)
            {
                index--;
                temp = temp ->next;
            }
            node ->next = temp ->next;
            temp ->next = node;
            cnt++;
        }
    }

    void deleteAtIndex(int index) {
        if(index < 0 || index >= cnt)
            return;
        Node* temp = head;
        if(index == cnt - 1)
        {
            while(index > 1)
            {
                index--;
                temp = temp ->next;
            }
            Node* clear = temp ->next;
            free(clear);
            temp ->next = NULL;
        }
        else
        {
            while(index > 1)
            {
                index--;
                temp = temp ->next;
            }
            Node* clear = temp ->next;
            Node* next = temp ->next ->next;
            free(clear);
            temp ->next = next;
        }
        cnt--;
    }
};