203移除链表元素
使用的是双指针方法,用pre记录cur的前一个位置,cur作为当前链表操作位置,如果出现了对应的val值,就让pre的next指向cur的next;再让cur移动到cur的next位置上。
先给出我写的代码:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyhead;
ListNode* cur;
ListNode* pre;
dummyhead->next = cur;
pre->next = cur;
while(cur->next != NULL){
if(cur->next->val == val){
pre = cur;
cur->next =cur->next->next;
}else{
pre = cur;
cur =cur ->next;
}
}
return dummyhead->next;
}
};
要错误集中在三点:
1.定义虚拟头结点 dummyhead的时候没有给出正确的定义式,,应该写成listnode* dummyhead = new listnode(0);这个具体为什么这么写目前还没有搞明白准备去chat上问问,
2.pre的定义式也给错了
3.也是我最错误的一个点,while的条件应该是当前cur的值是不是为空,为这样写条件呢?主要是不用去寻找我需要删除的节点的上一个节点,但是如果这样做了的话,我的最后一个节点如果等于val我就没有办法进行删除了。
修改之后的代码:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyhead = new ListNode(0);
ListNode* cur = head;
dummyhead->next = head;
ListNode* pre = dummyhead;
while(cur != NULL){
if(cur->val == val){
pre->next = cur->next;
cur =cur->next;
}else{
pre = cur;
cur =cur->next;
}
}
return dummyhead->next;
}
};
707.设计链表
一上来就发现自己对链表的概念完全不熟悉了。。。 this指针也不会用也不知道要定义什么东西,还在私有部分定义了一个dummyhead和dummyhead->next = head 直接报错了。其实官方题解已经给出了一个很明确的概念了,这个head其实就是我要定义的虚拟头结点(即dummyhead),然后后面的基本都对了却错在了get函数定义上。
class MyLinkedList {
public:
MyLinkedList() {
this->size = 0;
this->head =new ListNode(0);
}
int get(int index) {
if(index < 0 || index >= size ){
return -1;
}
ListNode* cur = head ;
while(index--){
cur = cur->next ;
}
return cur->val;
}
void addAtHead(int val) {
addAtIndex(0,val);
}
void addAtTail(int val) {
addAtIndex(size,val);
}
void addAtIndex(int index, int val) {
if(index > size ){
return;
}
index = max(0,index);
size ++;
ListNode* cur = head ;
while(index--){
cur = cur->next;
}
ListNode* toadd = new ListNode(val);
toadd->next =cur->next;
cur->next = toadd;
}
void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return ;
}
size --;
ListNode* cur =head;
while(index --){
cur = cur->next;
}
cur->next =cur->next->next;
}
private:
ListNode* head ;
int size;
};
主要还是概念没分清楚,head一直以为是第一个元素,其实它只是个虚拟头结点,我需要得到第index个位置的元素,如果index=0 并不是不运行程序,而是也要运行一次让cur指向虚拟节点head的下一个元素,所以我用while做就明显不对了。对应位置应该改成(for int i=0;i<=index;i++)保证程序至少运行一遍。
206 反转链表
没问题直接A了。