前言
算法打卡第三天
一、什么是链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
二、相关题目
203.移除链表元素(LeetCode)
代码如下(示例):
ListNode* removeElements(ListNode* head, int val) {
ListNode* headNode = new ListNode();//创建头结点,统一操作
headNode->next = head;
ListNode* cur = headNode;
while(cur->next != nullptr)
{
if(cur->next->val == val)
{
ListNode* tmp = cur->next;
cur->next = tmp->next;
delete tmp;
}
else
{
cur = cur->next;
}
}
return headNode->next;//返回头指针
}
707.设计链表 (LeetCode)
代码如下(示例):
class MyLinkedList {
public:
MyLinkedList() {
this->size = 0;
this->headNode = new ListNode();
}
int get(int index) {
if (index < 0 || index >= size) return -1;
int pos = 0;
ListNode* cur = headNode;
while(cur->next && pos <= index)//头结点为0.跑到index+1为当前结点
{
pos++;
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
ListNode* tmp = new ListNode(val, headNode->next);//让新结点指向头结点的下一个
headNode->next = tmp;
this->size++;
}
void addAtTail(int val) {
ListNode* cur = headNode;
while(cur->next != nullptr)
{
cur = cur->next;
}
ListNode* tmp = new ListNode(val);
cur->next = tmp;
this->size++;
}
void addAtIndex(int index, int val) {
int pos = 0;
ListNode* cur = headNode;
if (index == size)
{
addAtTail(val);
return;//尾部插入后返回
}
if (index > size) return;//大于长度什么都不做
if (index < 0)
{
addAtHead(val);
return;//头部插入后返回
}
while(cur->next && pos < index)
{
pos++;
cur = cur->next;
}
ListNode* newNode = new ListNode(val, cur->next);
cur->next = newNode;
this->size++;
}
void deleteAtIndex(int index) {
int pos = 0;
ListNode* cur = headNode;
if (index < 0 || index >= size) return;
while(cur->next && pos < index)
{
pos++;
cur = cur->next;
}
ListNode* tmp = cur->next;
cur->next = tmp->next;
delete tmp;
this->size--;
}
private:
int size;
struct ListNode{
int val;
struct ListNode* next;
ListNode() : val(0), next(nullptr){}//空参数
ListNode(int val) : val(val) , next(nullptr){}//一个参数
ListNode(int val, ListNode* head) : val(val), next(head){}//两个参数
};
ListNode* headNode; //头结点
};
206.反转链表 (LeetCode)
代码如下(示例):
ListNode* reverse(ListNode* cur, ListNode* pre)
{
if (cur == nullptr) return pre;
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
return reverse(tmp, cur);
}
ListNode* reverseList(ListNode* head) {
return reverse(head, nullptr);
}
总结
链表的题目主要是搞清楚前后结点的关系,比如操作的是哪个结点,需要进行一些什么操作,可以画图,重点是搞清楚题目的要求以及链表的一些基础操作。