- 链表理论基础
还是要强调一下链表的定义方式:
struct ListNode{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
注意:这里的ListNode(int x) : val(x), next(NULL) {}为构造函数,int x为构造函数的参数,意为如果该链表定义有初始化赋值,那么将该链表值直接赋值为该值,且默认链表指针指向NULL.
比如:
ListNode* head = new ListNode(5);
如果没有构造函数,则上述构造语句无效(不能直接给变量赋值)
- 移除链表元素
/**
* 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) {
while(head != NULL && head->val == val){
ListNode* tmp = head;
head = head->next;
delete tmp;
}
ListNode* cur = head;
while(cur != NULL && cur->next != NULL){
//注意括号内的语句,NULL指的是指针的空值,只有在cur指针不为空,且cur->next指针也不为空的情况下,才能保证括号内的代码有意义(如果cur->next为空,那么cur->next->val就无从谈起)
if(cur->next->val == val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
//这里需要注意,并不是cur = cur->next->next ; 因为cur是没问题的,而是cur->next的val为目标值,所以要将cur的下一位改为下下位(相当于删除下一位)
delete tmp;
}
else{
//注意这个else不要忘了,因为如果cur->next没有问题,那么仍然要继续往下走
cur = cur->next;
}
}
return head;
}
};
第二次做题:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head != NULL && head->val == val ){ //注意这里是while,不是if,while才能不断更新head的值
ListNode* tmp = head;
head = head->next;
delete tmp;
} //问题,为什么这里没有考虑head->next是否存在? 因为它是空的也不影响
ListNode* cur = head; //注意这句话的位置,不能写在最前面
while( cur != NULL && cur->next != NULL){ //这里的判断条件,第一次写错了注意 , 而且注意&&的前后顺序
if(cur->next->val == val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else{
cur = cur->next; //注意删除链表节点和链表移至下一位的区别,删除是cur->next = cur->next->next;
}
}
return head; //注意return的位置,其在removeElements内
}
};
-
反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL; //注意链表的定义方式
ListNode* cur = head ;
while(cur != NULL){ //注意此处不可定义为:cur->next != nullptr,否则遍历会少一项;定义为while(cur)也是同一个意思
ListNode* tmp = cur->next ;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
注意NULL和nullptr的区别:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL; //注意链表的定义方式
ListNode* cur = head ;
while(cur != NULL){ //注意此处不可定义为:cur->next != nullptr,否则遍历会少一项;定义为while(cur)也是同一个意思
ListNode* tmp = cur->next ;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};