[蓝蓝计算机考研算法]-day25链表去重&&循环双链表是否对称

149 阅读2分钟

链表去重

递增的单链表,去掉表中重复的元素,只保留一个数值。

示例

输入:1 2 2 3 4 4 4
输出:1 2 3 4

思路

创建单链表,循环遍历它的每一个元素。当结点指向的元素与下一个元素数值相同时,结点继续向后遍历,否则(表示前后不同)就输出该元素。直到循环到最后一个元素时,直接输出,结束循环。

具体实现

#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){}
}LinkList; 

int main(){
	int x;
	LNode* head = new LNode(); //定义头结点
	LNode* p = head; //保存头结点 
	
	while(cin>>x){ //创建一个单链表 
		LNode* s = new LNode(x);
		head->next=s;
		head=head->next;
		if(cin.get() == '\n') break;
	}
	
	p=p->next; //p指向第一个元素
	while(p){ //遍历链表输出 
		if(p->data == p->next->data){
			p=p->next;
			if(p->next == nullptr){ //当结点指向链表最后一个元素时 
				cout<<p->data;
				break;
			}
		}else{
			cout<<p->data<<" ";
			p=p->next;
		}	
	} 
	return 0;
}

循环双链表是否对称

判断带头结点的循环双链表是否对称。 若对称输出“yes”,否则输出“no”。

示例

输入:1 2 3 4 1
输出:no

思路

  1. 定义头、尾指针,创建循环双链表。

  2. 头、尾指针依次分别向前、向后循环遍历,当指针对应的元素值相同时,继续向后、向前遍历。否则则不对称。循环条件为头指针不等于尾指针(奇数个数)且头指针的下一个指针不等于尾指针(偶数个数)。

具体实现

#include<bits/stdc++.h>
using namespace std;
struct LNode{
	int data;
	LNode *prior; 
	LNode *next;
	LNode():data(0), prior(nullptr), next(nullptr){}
	LNode(int x):data(x), prior(nullptr), next(nullptr){}
}LinkList; 

int main(){
	
	int x,flag=0,cnt=0;
	LNode *head = NULL; //定义头结点
	LNode *next; //尾结点 
	
	while(cin>>x){ //创建循环双链表
		cnt++; //统计元素个数 
		if(head == NULL){
			head = new LNode(x);
			next = head;
		} else{
			LNode* s = new LNode(x);
			next->next = s;
			s->prior = next;
			next = next->next;
		}
		
		next->next = head; //串成一个环 
		head->prior = next;
		
		if(cin.get() == '\n') break;
	}
	
//	for(int i=0; i<cnt; i++){ //输出链表元素 
//		cout<<next->next->data;
//		next=next->next;
//	}
 
	while(head!=next && head->next!=next){ //遍历链表输出 
		if(head->data == next->data){
			head=head->next; //头指针向后走 
			next=next->prior; //尾指针向前走 
		}else{
			flag=1; //链表不对称 
			break;
		}	
	} 
	if(flag==1) cout<<"no";
	else cout<<"yes";
	return 0;
}

小结

  • 单链表的定义,基本操作要熟练。

  • 循环双链表的定义,建立过程要熟练。