707.设计链表

113 阅读2分钟

707.设计链表

LeetCode

描述:

设计一个链表, 实现链表的相关功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

思路:

设计链表即是考察链表的基础操作, 初始化、添加、删除、获取指定元素, 在明白了链表的结构之后, 解题方法就有了. 可见链表理论基础

代码:

/*
 * @lc app=leetcode.cn id=707 lang=cpp
 *
 * [707] 设计链表
 */

// @lc code=start
// 链表结构体
struct LinkedList
{
    int val;
    struct LinkedList *next;

    LinkedList() : val(0), next(nullptr) {}
    LinkedList(int val) : val(val), next(nullptr) {}
    LinkedList(int val, struct LinkedList *next) : val(val), next(next) {}
};

class MyLinkedList
{
private:
    int m_size;
    struct LinkedList *m_head;

public:
    // 初始化链表
    MyLinkedList()
    {
        m_head = new LinkedList(0);
        m_size = 0;
    }

    // 获取链表中第index个节点的值
    int get(int index)
    {

        if (index < 0 || index > (m_size - 1))
        {
            return -1;
        }

        LinkedList *temp = m_head->next;
        while (index--)
        {
            temp = temp->next;
        }

        return temp->val;
    }

    // 在链表的第一个元素之前添加一个值为val的节点
    void addAtHead(int val)
    {
        LinkedList *newLinked = new LinkedList(val, m_head->next);
        m_head->next = newLinked;
        m_size += 1;
    }

    // 将值为val的节点追加到链表的最后一个元素
    void addAtTail(int val)
    {
        LinkedList *newNode = new LinkedList(val);
        LinkedList *currentNode = m_head;

        while (currentNode->next != nullptr)
        {
            currentNode = currentNode->next;
        }

        currentNode->next = newNode;
        m_size++;
    }

    // 在链表中的第index个节点之前添加值为val 的节点
    void addAtIndex(int index, int val)
    {
        if (index > m_size || index < 0)
        {
            return;
        }

        LinkedList *newNode = new LinkedList(val);
        LinkedList *currentNode = m_head;
        while (index--)
        {
            currentNode = currentNode->next;
        }

        newNode->next = currentNode->next;
        currentNode->next = newNode;

        m_size++;
    }

    // 如果索引index有效, 则删除链表中的第index个节点
    void deleteAtIndex(int index)
    {
        if (index < 0 || index > m_size)
        {
            return;
        }

        LinkedList *currentNode = m_head;

        while (index--)
        {
            currentNode = currentNode->next;
        }

        LinkedList *tempNode = currentNode->next;
        currentNode->next = currentNode->next->next;
        delete tempNode;

        m_size--;
    }
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

参考:

[1] 链表理论基础