203.移除链表元素
问题:
1、为什么要用 ListNode* tmp = cur->next; 而不能直接cur->next = cur->next->next;
2、如何定义虚拟头节点
代码:
/**
* 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);
dummyhead -> next = head;
ListNode * cur = dummyhead;
while(cur->next!=nullptr) {
if(cur->next->val==val) {
ListNode * tmp =cur->next;//手动释放内存
cur->next=cur->next->next;
delete tmp;
}
else cur=cur->next;
}
head=dummyhead->next;
delete dummyhead;
return head;
}
};
707.设计链表
遇到的问题:
1、如何定义结构体指针?
2、插入头节点错误:
void addAtHead(int val) {
LinkedNode * tmp = new LinkedNode(val);
tmp->next=dummyhead->next->next;
tmp=dummyhead->next;
size++;
}
tmp的next应该等于头节点的next而不是next的next
3 遍历链表的时候 cur=dummyhead还是dummyhead->next?
4、操作空指针报错!! 要区分cur->next = tmp 和tmp=cur->next;
代码:
class MyLinkedList {
public:
//定义结构体指针
struct LinkedNode{
int val;
LinkedNode *next;
LinkedNode(int x):val(x),next(nullptr){}
};
int size;
LinkedNode * dummyhead;
MyLinkedList() {
size=0;
dummyhead=new LinkedNode(0);
}
int get(int index) {
LinkedNode* cur=dummyhead->next;
if (index<0||index>=size)
return -1;
while(index--) {
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode * tmp = new LinkedNode(val);
tmp->next=dummyhead->next;
dummyhead->next=tmp;
size++;
}
void addAtTail(int val) {
int count=size;
LinkedNode*tmp =new LinkedNode(val);
LinkedNode* cur=dummyhead;
while(count--) {
cur=cur->next;
}
cur->next=tmp;
size++;
}
void addAtIndex(int index, int val) {
if(index<=size&&index>=0) {
LinkedNode *tmp =new LinkedNode(val);
LinkedNode* cur=dummyhead;
while(index--) {
cur=cur->next;
}
tmp->next=cur->next;
cur->next=tmp;
size++;
}
}
void deleteAtIndex(int index) {
if(index>=0&&index<size) {
LinkedNode* cur=dummyhead;
while(index--) {
cur=cur->next;
}
LinkedNode * tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
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);
*/
206.反转链表
问题:
1、如果第二个元素指向第一个的话,怎么处理第二个后面的元素
2、学习一下双指针方法
3、从双指针的角度来考虑一下递归
双指针的方法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur!=nullptr) {
ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
};