链表可以使用的地方
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]<<' '; }