【id:144】【10分】A. 前驱后继(线性结构)
题目描述
在双向链表中,A有一个指针指向了后继节点B,同时,B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点,也能从链表尾节点开始遍历所有节点。
对于给定的一列数据,按照给定的顺序建立双向链表,按照关键字找到相应节点,输出此节点的前驱节点关键字及后继节点关键字。
输入
第一行两个正整数n(代表节点个数),m(代表要找的关键字的个数)。
接下来输入n个整数为关键字key(数据保证关键字在数列中没有重复)。
接下来有m个要查找的关键字,每个占一行。
输出
对给定的每个关键字,输出此关键字前驱节点关键字和后继节点关键字。如果给定的关键字没有前驱或者后继,则不输出。给定关键字为每个输出占一行。
输入样例1 <-复制
10 3
1 2 3 4 5 6 7 8 9 0
3
1
0
输出样例1
2 4
2
9
#include<bits/stdc++.h>
using namespace std;
struct ListNode{
int value;
ListNode *pre;
ListNode *next;
ListNode(int i){
this->value=i;
this->pre=NULL;
this->next=NULL;
}
};
void List_find(int data,ListNode* head){
ListNode* p=head;
while(p!=NULL){
//cout<<"NOW P:"<<p<<" "<<p->value<<endl;
if(p->value==data)
{int flag=0;
if(p->pre){
cout<<p->pre->value;
flag=1;
}
if(p->next){
if(flag==1)
cout<<" ";
cout<<p->next->value;
}
cout<<endl;
return;
}
p=p->next;
}
return;
}
int main(){
ListNode* head=new ListNode(-1);
ListNode* prev=head;
int n,t,params;
cin>>n>>t;
while(n--){
cin>>params;
prev->next=new ListNode(params);
prev->next->pre=prev;
prev=prev->next;
}
head=head->next;
head->pre=NULL;
while(t--){
cin>>params;
List_find(params,head);
}
}