学习目的
1.会链表的定义、常用的基本操作。
2.会解决几种常用的链表相关的题目。
(一)链表基础知识
1.概念基础
(1)组成:数据+指针
(2)类型:单链表、双链表、循环链表
(3)存储方式:分散存储
2.代码实现
(1)节点定义
struct ListNode{
int val;
ListNode *next;
ListNode(int x): val(x),next(NULL){
}
};
(2)节点初始化
初始化节点:
使用默认构造函数初始化节点时,默认构造函数不会初始化头结点。
ListNode*head = new ListNode()
head->val = 5;
(3)虚拟头结点
//设置一个虚拟的头结点
ListNode* dummyHead = new ListNode(0);
//让头结点与head发生联系
dummyHead->next = head;
//定义一个新的节点,对现有链表进行操作
ListNode* cur = dummyHead;
...//之间是删除添加等一些基本操作
//把头结点还给头结点
head = dummyHead->next;
//删除虚拟结点
delete dummyHead;
return head;
3.常用操作
(1)删除结点
(2)添加结点
(二)链表例题
1.移除链表中的元素
移除链表中的元素
题目梳理:删除满足某一个值的所有结点
步骤:
a.设置虚拟头结点(考察结点的创建,初始值以及下一个指针的指向)【在代码的末端同步写一个删除头结点】
b.遍历列表(链表中结点具体值的读取、while 循环的编写)
c.删除符合条件的结点(链表结点的删除)
运行时出现的错误以及解决:LeetCode:执行出错runtime error: member access within null pointer of type ‘ListNode‘ (solution.cpp)解决方法
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while (cur!=NULL&&cur->next != NULL){
//需要有一个这样的判断条件通常
if(cur->next->val == val){
ListNode* tempt = cur->next;
cur->next=cur->next->next;
delete tempt;
}else{
cur = cur->next;
}
}