链表可以使用的地方
C++11后加入了nullptr
表示空指针的时候最好用nullptr
Listnode* n=new Listnode(val);//新建值为val的链表结点n
Listnode* n=new Listnode(val);//新建值为val的链表结点n
dummyhead=new Listnode();//创建链表虚拟头结点
dummyhead=new Listnode();//创建链表虚拟头结点
注意代码框里的注释
注意代码框里的注释
注意代码框里的注释
⭐1.移除链表元素203. 移除链表元素 - 力扣(LeetCode)
🍔方法1——常规做法
/**
* 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* tmp;
while(head!=nullptr&&head->val==val)//删除头节点
{ //注意使用while
tmp=head;
head=head->next;
delete tmp;
}
ListNode* cur=head;
while(cur!=nullptr&&cur->next!=nullptr)//删除非头节点
{
if(cur->next->val==val)
{
tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
}
else
{
cur=cur->next;
}
}
return head;
}
};
🍔方法2——虚拟头结点 dummyhead
dummyhead->next=head
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head
ListNode* cur = dummyHead;//cur用来遍历,不能用dummyhead来遍历,因为头结点的指向不能变化
while (cur->next != NULL)
{
if(cur->next->val == val)
{
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;//继续向下寻找
}
}
head = dummyHead->next;//一定要有这一步,不能直接return head 因为head可能已经被删了
delete dummyHead;
return head;
}
};
⭐2.反转链表
这个是看y总的AcWing 35. 反转链表(每日一题·春季) - AcWing
/**
* 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) {
if(head==nullptr||head->next==nullptr) return head;//如果首结点为空,直接返回首结点
auto a=head,b=a->next;//初始化,确定位置(注意确定head的位置)注意:这里是原始位置
while(b)
{
auto c=b->next;
b->next=a;
a=b;
b=c;
}
head->next=nullptr;
return a;
}
};
⭐3.两两交换链表的结点
/**
* 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* swapPairs(ListNode* head) {
// 已有的链表加一个头部 head node
ListNode* resultHead = new ListNode();
resultHead->next = head;
// curNode 遍历链表时用
ListNode* curNode = resultHead;//如果不再建一个curNode(下面的curNode全部变成resultHnad,那么在执行到return resultHead->next后,不会输出任何东西)
//头结点的指向是不能改的,所以要用一个curNode辅助遍历
while(curNode != nullptr && curNode->next != nullptr && curNode->next->next!=nullptr)
{
ListNode* a = curNode;
ListNode* b = curNode->next;
ListNode* c = c->next;
// 两两交换链表结点
a->next = c;
b->next = c->next;
c->next = b;
// 注意 后移2位
curNode = curNode->next->next;
}
return resultHead->next;//是resultHead
}
};
其实这个题还能用数组写AcWing 3709. 单链表节点交换——似乎不需要用链表 - AcWing
#include<bits/stdc++.h>
using namespace std;
int a[110];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int len=n;
if(n%2!=0)len--;//如果n是奇数,则最后一个数不用交换。
for(int i=1;i<len;i+=2)swap(a[i],a[i+1]);
for(int i=1;i<=n;i++)cout<<a[i]<<' ';
}
⭐4.设计链表