题目描述
在双向链表中,A有一个指针指向了后继节点B,同时,B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点,也能从链表尾节点开始遍历所有节点。
对于给定的一列数据,按照给定的顺序建立双向链表,按照关键字找到相应节点,输出此节点的前驱节点关键字及后继节点关键字。
输入
第一行两个正整数n(代表节点个数),m(代表要找的关键字的个数)。
接下来输入n个整数为关键字key(数据保证关键字在数列中没有重复)。
接下来有m个要查找的关键字,每个占一行。
输出
对给定的每个关键字,输出此关键字前驱节点关键字和后继节点关键字。如果给定的关键字没有前驱或者后继,则不输出。给定关键字为每个输出占一行。
样例输入
10 3
1 2 3 4 5 6 7 8 9 0
3
1
0
样例输出
2 4
2
9
#include<iostream>
using namespace std;
//双向链表的结点,两个指针域,一个数据域
class listnode {
public:
int key;
listnode* pre;
listnode* next;
listnode() {
pre = NULL;
next = NULL;
}
};
class linklist {
public:
int len;
listnode* head;
//只有一个表头结点的空链表
linklist() {
len = 0;
head = new listnode();
head->next = NULL;
head->pre = NULL;
}
void Create(int n) {//n表示链表长度
len = n;
int k;//k表示数据
listnode* p = head;//q一开始指向空的头指针
for (int i = 1;i <= len;i++) {
listnode* q = new listnode();//新建一个结点
cin >> k;
q->key = k;//把数据存入结点p的数据域中
p->next = q;
q->pre = p;
p = q;
}
//head->pre = NULL;
}
//寻找指定数据域的结点
listnode* find(int k) {//k是指定数据域的内容
listnode* p = head;
while (p->next != NULL) {
p = p->next;//这个要注意逻辑,放在if前和if后是不一样的,放在后面那么最后一个数字就
//没有执行循环无法进行数据比较了
if (p->key == k) {
return p;
}
}
}
void print(int k) {
find(k);
if ((find(k)->next != NULL) && (find(k)->pre != head)) {
cout << find(k)->pre->key << " " << find(k)->next->key << endl;
}
else if (find(k)->pre ==head) {
cout << find(k)->next->key << endl;
}
else {
cout << find(k)->pre->key << endl;
}
}
};
int main() {
int n, m, key;
linklist l;
cin >> n >> m;
l.Create(n);
while (m--) {
cin >> key;
l.find(key);
l.print(key);
}
}