链表理论
链表的定义:
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
不定义构造函数也是可以的,c++会默认生成一个构造函数。但是该构造函数不会初始化任何成员变量。所以不自己定义构造函数而去使用默认的构造函数时,在初始化的时候就不能直接给变量赋值。
移除列表元素
错误代码
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head==nullptr) return head;
ListNode *pre=new ListNode(0,head);
ListNode *ptr = new ListNode(0,head);//这样写会报heap-use-after-free 错误。改为=pre即可通过。
while(ptr->next!=nullptr){
if(ptr->next->val==val){
ListNode *tmp = nullptr;
tmp = ptr->next;
ptr->next=pt->next;
}
else ptr=ptr->next;
}
head = pre->next;
return head;
}
};
这里加了个虚拟头节点pre,如果不加则需要单独对头节点进行操作(head=head->next)。
设计链表
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode *next;
LinkedNode(int val):val(val),next(nullptr){}
};
MyLinkedList() {
_dummynode = new LinkedNode(0);
_size = 0;
}
int get(int index) {
if(index<0||(index>(_size-1))) return -1;
LinkedNode * cur = _dummynode->next;
for(int i=0;i<index;i++){
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode * cur = new LinkedNode(val);
cur->next=_dummynode->next;
_dummynode->next=cur;
_size++;
}
void addAtTail(int val) {
LinkedNode * cur = new LinkedNode(val);
cur->next=nullptr;
LinkedNode * tmp = _dummynode;
while(tmp->next!=nullptr){
tmp=tmp->next;
}
tmp->next = cur;
_size++;
}
void addAtIndex(int index, int val) {
if(index==(_size-1)) addAtTail(val);
if(index>(_size-1)) return;
if(index<0) addAtHead(val);
if((index>=0)&&(index<(_size-1))) {
LinkedNode *cur = _dummynode;
LinkedNode *tmp = new LinkedNode(val);
while(index--){
cur=cur->next;
}
tmp->next=cur->next;
cur->next=tmp;
_size++;
}
}
void deleteAtIndex(int index) {
if((index>=0)&&(index<(_size-1))){
LinkedNode *cur = _dummynode;
LinkedNode * tmp = new LinkedNode(0);
while(index--){
cur = cur->next;
}
tmp = cur->next;
cur->next = tmp->next;
delete tmp;
}
_size--;
}
void printLinkedList() {
LinkedNode* cur = _dummynode;
while (cur->next != nullptr) {
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
LinkedNode *_dummynode;
int _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);
*/
错误很难找到,还要仔细看一下
反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr) return head;
ListNode *pre,*cur,*tmp;
pre = nullptr;
tmp = nullptr;
cur = head;
while(cur!=nullptr){
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
反转链表需要三个指针,一个指向当前操作的节点,另外两个分别指向该节点的前序和后序节点