现有n个结点(编号为从1
到n
),以及链表的第一个结点的编号,判断该链表是否是回文的,即链表的结点按数据域正序和逆序是相同的。
解题思路:构造正常的链表后,制作一个逆序链表,然后进行简单模拟比较就行。
主要考察的是如何构造逆序链表。
通过三个指针,next,current和last来进行交互移动。
具体代码如下:
#include <iostream>
using namespace std;
struct node{
int id;
int data;
int next;
};
int main(){
int n,first;
cin>>n>>first;
node nodelist[n+1];
int count = 0;
for(int i=0;i<n;i++){
int nodeid;
cin>>nodeid;
nodelist[nodeid].id = nodeid;
cin>>nodelist[nodeid].data>>nodelist[nodeid].next;
}
node reverselist[n+1];
int current = first,last = -1;
for(;;){
if(current==-1){
break;
}
int next = nodelist[current].next;
reverselist[current].id = nodelist[current].id;
reverselist[current].data = nodelist[current].data;
reverselist[current].next = last;
last = current;
current = next;
count++;
}
int j = last;
bool flag = true;
int c = 0;
for(int i=first;;){
if(c==count/2){
break;
}
if(nodelist[i].data!=reverselist[j].data){
flag = false;
break;
}
i = nodelist[i].next;
j = reverselist[j].next;
c++;
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}