1.该题难点:链表如何查指定位置的值?
每次找到第m个节点都需要从头节点开始遍历,所以将 cur 重新指向虚拟头结点,以便重新遍历链表。
使用 while 循环,寻找链表中的第 m 个元素, 只要cur没有指向null,就一直循环下去。
2.特殊情况的处理
m位置不合法的情况:
1)当while循环结束后,如果cur指向null,说明输入的m已经超出了链表的长度;
2)如果cur还是指向头结点,说明没有进入到while循环,也就是m=0
3.总结
#include <iostream>
using namespace std;
// 1.定义链表节点结构体
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
int main()
{
// 链表长度是n,可查值k次(查的值为链表中的第 m 个元素)
int n, k, m, val;
// 2.构建链表
// 定义一个虚拟头结点,数据域为0
ListNode *headNode = new ListNode(0);
// 让当前节点指向头结点
ListNode * cur = headNode;
cin >> n >> k;
while(n--)
{
cin >> val;
// 构建一个新节点
ListNode *newNode = new ListNode(val);
// 将新节点接入链表
cur -> next = newNode;
// 更新尾节点
cur = cur -> next;
}
// 可指定查值k次
while(k--)
{
// 输入k个m, m表示需要输出的节点的顺序
cin >> m;
// 注意点1:构建完毕,每次需要重新从头结点开始遍历
// cur重新指向虚拟头节点,以便重新遍历链表
cur = headNode;
// 查询链表中的第 m 个元素
while(m--)
{
// 注意点2:已经更新了尾节点,所以判断条件是cur != nullptr
if(cur != nullptr)
cur = cur -> next;
else
break;
}
// 注意点3:当前节点(尾节点cur)已经更新了,
// 所以判断条件是cur == nullptr,输出的值也是尾节点的值 cur->val
// 注意点4:m位置不合法的情况:
// 1)cur == NULL 表示 m 超出了链表长度
// 2)cur == headNode 表示 m = 0
if(cur == nullptr || cur == headNode)
cout << "Output position out of bounds." << endl;
else
cout << cur->val << endl;
}
return 0;
}