这里写自定义目录标题
链表基础知识
节点:
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(nullptr){};//初始化节点
}
对链表有两种常见的操作方式:
1.直接对头节点进行操作
2.虚拟头节点
删除目标节点的方式一般为找到它的前一个节点,
p->next->val==target;
ListNode* temp=p->next;
p=temp->next;
delete temp;
设计链表
class MyLinkedList {
public:
struct ListNode{//在链表中定义节点
int val;
ListNode*next;
ListNode(int x):val(x),next(NULL){};
}
//....
private:
int size;//链表的大小
ListNode* head;//头指针(虚拟)
};
注意
一次运行中初始化的时候没有给head赋值为NULL,导致其成为野指针报错;
ListNode(){};
ListNode(int x):val(x),next(NULL){};
//报错
member access within misaligned address 0xbebebebebebebebe for type 'ListNode', which requires 8 byte alignment (solution.cpp)
应该写成
ListNode(){next=NULL};
ListNode(int x):val(x),next(NULL){};
翻转链表
ListNode* pre=NULL;
ListNode* cur=head;
ListNode* temp=new ListNode();
while(cur!=nullptr){
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
一个mistake:
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=nullptr){
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
delete temp;
}
在里面定义临时指针temp,想着用完了及时处理掉,但忽略了temp
指向的内存也是cur指向的,所以会有指针悬空的报错。
也可以写成递归的形式: