203.移除链表元素 :链表元素移除要靠上一个节点的内容来确认是否为头,需要注意是否为头节点,因为头节点没有上一节点的说法。或者创造一个虚拟头结点,这样就不用考虑链表中需要溢出的元素是否为头结点。
在这里插入代码片
/**
/**
* 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){//本题中必须同时满足,不能保证
if(cur->next->val==val){
ListNode *tmp=cur->next;
cur->next=cur->next->next;
}
else{
cur=cur->next;//cur代表当前节点,想要当前节点的值就是cur->val,
}
}
return head;//链表只要输出头结点,就可以
}
};
虚拟头结点的方法
listnode的初始化方式是什么?有哪几种方式
class Solution{
public:
ListNode *removeElements(ListNode* head,int val){
//虚拟头结点
ListNode* dunnyhead=new ListNode(0);
dunnyhead->next=head;
ListNode* cur=dunnyhead;
while(cur->next!=NULL){
if(cur->next->val==val){
ListNode *tmp=cur->next;
cur->next=cur->next->next;
}
else{
cur=cur->next;//cur代表当前节点,想要当前节点的值就是cur->val,
}
}
return dunnyhead->next;
}
};
707.设计链表
class MyLinkedList {
public:
struct LinkedNode{//定义了一个名为 LinkedNode 的结构体 (struct)。在这个结构体中,每个节点包含一个整数值 val 和一个指向下一个节点的指针 next。
int val;
LinkedNode *next;
LinkedNode(int val):val(val),next(nullptr){}//结构体的构造函数被定义为 LinkedNode(int val) : val(val), next(nullptr){},它接受一个整数参数 val 作为输入。构造函数使用成员初始化列表的方式来初始化新创建的节点的成员变量 val 和 next。
//val(val): 这部分表示将构造函数的参数 val 赋值给成员变量 val。这样,在创建新节点时,它的 val 成员变量会被设置为传入构造函数的 val 参数的值。
//next(nullptr): 这部分表示将指针成员变量 next 初始化为 nullptr,即空指针。在创建新节点时,新节点的 next 成员变量会被设置为空指针,表示该节点暂时没有下一个节点。
};
MyLinkedList() {
dummyhead=new LinkedNode(0);
_size=0;
}
int get(int index) {
if(index>(_size-1)||index<0){
return -1;
}
LinkedNode* cur=dummyhead->next;
while(index--){//只需要用n=0来判断,看会输出哪个位置的值。
cur=cur->next;//while减到0是直接退出循环,因此返回需要下一个,
}
return cur->val;
}
void addAtHead(int val) {//toujiw
LinkedNode* newNode=new LinkedNode(val);
newNode->next=dummyhead->next;
dummyhead->next=newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur=dummyhead;
while(cur->next!=nullptr){
cur=cur->next;
}
cur->next=newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index>_size)return;
if(index<0)index=0;
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur=dummyhead;
while(index--){
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index>=_size||index<0)return;
LinkedNode* cur=dummyhead;
while(index--){
cur=cur->next;
}
LinkedNode*tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
}
private:
int _size;
LinkedNode* dummyhead;
};
206.反转链表
/**
* 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* reverseList(ListNode* head) {
ListNode* tmp;
ListNode* cur=head;
ListNode* pre=NULL;
while(cur){
tmp=cur->next;//先保存cur节点,下一阶段要用
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;//结束后cur只想了null,pre指向了头结点
}
};