[蓝蓝计算机考研算法]-day14删除链表重复元素&反转链表

98 阅读1分钟

删除排序链表中的重复元素

给定一个已排序的链表的头 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;
}

小结

反转链表=逆序输出链表->头插法建立单链表,可实现逆序输出。