删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序 的链表。
提示:
- 链表中节点数目在范围 [0, 300] 内。
- -100 <= Node.val <= 100 。
- 题目数据保证链表已经按升序 排列。
示例
输入:1,1,2
输出:1,2
输入:1,1,2,3,3
输出:1,2,3
思路
-
首先创建头结点head并用指针p保存,输入链表内容。
-
再定义一个指针指向p的下一个结点。然后用while循环遍历链表,条件是q指针指向的结点存在。
-
若p和q相等,则二者都继续向后循环;若二者不同,则输出p指向的结点数据,并继续向后循环,直至q指向结点不存在(到尾部)。此时p指针指向最后一个结点,所以最后,输出p所指结点的元素。
具体实现
#include<bits/stdc++.h>
using namespace std;
struct LNode{
int data;
LNode* next;
LNode():data(0),next(nullptr){} //初始化
LNode(int x):data(x),next(nullptr){}
};
int main(){
int data;
LNode* head = new LNode(); //创建头结点
LNode* p=head; //保存头结点,头结点为空
while(cin>>data){ //输入链表中内容
LNode* s = new LNode(data); //创建结点
head->next=s;
head=head->next;
if(cin.get()=='\n') break;
}
p=p->next; //p指向头指针下一个元素,即第一个元素
LNode* q=p->next;
while(q){
if(p->data==q->data){
p=p->next;
q=q->next;
}else{
cout<<p->data<<" ";
p=p->next;
q=q->next;
}
}
cout<<p->data;
return 0;
}
小结
-
get()是cin输入流对象的成员函数,本题中通过get函数判断输入是否是换行,从而结束输入。
-
定义链表结构、建立单链表等链表有关的基础操作一定要掌握。
反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
提示:
- 链表中节点的数目范围是 [0, 5000] 。
- -5000 <= Node.val <= 5000。
示例
输入:1 2 3 4 5
输出:5 4 3 2 1
输入:1 2
输出:2 1
思路
-
头插法建立单链表,再循环输出单链表,即是翻转的。(逆序)
-
若忘记头插法,可在纸上写出头插法实现单链表的过程,即可写出代码。
具体实现
#include<bits/stdc++.h>
using namespace std;
struct LNode{
int data;
LNode* next;
LNode():data(0),next(nullptr){} //初始化
LNode(int x):data(x),next(nullptr){}
};
int main(){
int data;
LNode* head = new LNode(); //创建头结点
LNode* p=head; //保存头结点,头结点为空
while(cin>>data){ //头插法建立单链表
LNode* s = new LNode(data); //创建结点
s->next=head->next;
head->next=s;
if(cin.get()=='\n') break;
}
p=p->next; //指向头结点的下一个结点,即第一个数
while(p){
cout<<p->data<<" ";
p=p->next;
}
return 0;
}
小结
反转链表=逆序输出链表->头插法建立单链表,可实现逆序输出。