本文记录的是刷题过程中的重要概念和笔记。如有侵权,请联系删除。
基础知识
1. 定义
链表节点的定义,很多同学在面试的时候都写不好。
这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。
而在面试的时候,一旦要自己手写链表,就写的错漏百出。
这里我给出C/C++的定义链表节点方式,如下所示:
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
完整:
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* **ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}**
* };
不定义构造函数是可以的,C++默认生成一个构造函数。
但是这个构造函数不会初始化任何成员变量,下面我来举两个例子:
通过自己定义构造函数初始化节点:
ListNode* head = new ListNode(5);
使用默认构造函数初始化节点:
ListNode* head = new ListNode();
head->val = 5;
所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!
2. 类型
单链表 双链表 循环链表
3. 存储方式
数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。
链表是通过指针域的指针链接在内存中各个节点。
4. 性能分析
203.移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
示例 2:输入:head = [], val = 1输出:[]
示例 3:输入:head = [7,7,7,7], val = 7输出:[]
思路
可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
**ListNode* dummyHead = new ListNode(0,head);**
ListNode* currentNode = dummyHead;
while(currentNode->next){
if(currentNode->next->val == val){
ListNode* tmp = currentNode->next;
currentNode->next = tmp->next;
**delete tmp;**
}else{
currentNode=currentNode->next;
}
}
**head=dummyHead->next;
delete dummyHead;**
return head;
}
};
dummy adj. 假的,仿真的
707.设计链表
题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
解法:略