707.设计链表
描述:
设计一个链表, 实现链表的相关功能:
- 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] 链表理论基础