链表去重
递增的单链表,去掉表中重复的元素,只保留一个数值。
示例
输入: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
思路
-
定义头、尾指针,创建循环双链表。
-
头、尾指针依次分别向前、向后循环遍历,当指针对应的元素值相同时,继续向后、向前遍历。否则则不对称。循环条件为头指针不等于尾指针(奇数个数)且头指针的下一个指针不等于尾指针(偶数个数)。
具体实现
#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;
}
小结
-
单链表的定义,基本操作要熟练。
-
循环双链表的定义,建立过程要熟练。