思路:就是正常移除操作
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//删除头节点
while(head!=NULL&&head->val==val){
ListNode* tmp = head;
head=head->next;
delete tmp;
}
ListNode *now=head;
while(now!=NULL&&now->next!=NULL){
if(now->next->val==val){
ListNode* tmp = now->next;
now->next=now->next->next;
delete tmp;
}else{
now=now->next;
}
}
return head;
}
};
本以为这道题很简单但还是看了答案 对于头节点和非头节点的处理不是很好 需要注意边界值的处理 设置虚拟头节点是一个很好的想法
思路:模板
class MyLinkedList {
public:
// 定义链表节点结构体
struct node {
int val;
node* next;
node(int val):val(val), next(nullptr){}
};
// 初始化链表
MyLinkedList() {
head = new node(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
size = 0;
}
// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
int get(int index) {
if(index>=size||index<0)
return -1;
node *now=head->next;
while(index--)
now=now->next;
return now->val;
}
// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
void addAtHead(int val) {
node *temp=new node(val);
temp->next=head->next;
head->next=temp;
size++;
}
// 在链表最后面添加一个节点
void addAtTail(int val) {
node *now=head;
while(now->next!=NULL)
now=now->next;
now->next=new node(val);
size++;
}
// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果index大于链表的长度,则返回空
// 如果index小于0,则在头部插入节点
void addAtIndex(int index, int val) {
//重点 可以查到不存在的元素前面
if(index>size)
return;
if(index < 0) index = 0;
node *now=head;
while(index--)
now=now->next;
node *temp=new node(val);
temp->next=now->next;
now->next=temp;
size++;
}
// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
void deleteAtIndex(int index) {
if(index>=size||index<0)
return;
node *now=head;
while(index--)
now=now->next;
node *temp=now->next;
now->next=now->next->next;
delete temp;
temp=NULL;
size--;
}
private:
int size;
node* head;
};
debug好久好久 习惯acm模式 开始转变leetcode模式有点不习惯 可以插在不存在元素的前面这个bug卡了我好久 一点一点对照代码才发现 还是要细心读懂题意。
思路:双指针法 两种实现方式
迭代:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre=NULL,*now=head;//初始化
while(now!=NULL){
ListNode *temp=now->next;
now->next=pre;
pre=now;
now=temp;
}
return pre;
}
};
递归:
class Solution {
public:
ListNode *reverse(ListNode*pre,ListNode *now){
if(now==NULL)
return pre;
ListNode *temp=now->next;
now->next=pre;
return reverse(now,temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(NULL,head);
}
};
链表细节有些多