一、问题描述
二、算法步骤
首先遍历一次链表,获取链表长度n,然后判断k值的合法性,接着遍历链表n-k次,输出最后的值即可。还可以定义两个指针pq,从链表第一个节点开始,先让p开始走,走到k位置后,q开始走,当p走到末尾时,q的位置就是答案。因为p走到末尾时,q走了n-k步。
遍历两次代码及答案:
#include
#include
#include
using namespace std;
typedef struct Node
{
int data;
struct Node* link;
}Node,LinkList;
Node* Init(LinkList* L)
{
L = (LinkList*)malloc(sizeof(Node));
L->data = 0;
L->link = NULL;
return L;
}
Node* Create(int x)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = x;
newNode->link = NULL;
return newNode;
}
void Print(LinkList* L)
{
Node* cur = L;
cur = cur->link;
while (cur!= NULL)
{
printf("%d",cur->data);
if(cur->link!=NULL)printf("->");
cur = cur->link;
}
printf("\n");
}
int main()
{
///
///链表初始化
///
///
LinkList* L = NULL;
L = Init(L);
int n; cin >> n;
Node* cur = L;
for (int i = 0; i < n; i++)
{
int x; cin >> x;
Node* newNode = Create(x);
cur->link = newNode;
cur = cur->link;
}
Print(L);
///
/// 解法步骤
///
///
int k; cin >> k;
int count = 0;
/*扫描两次*/
cur = L;
cur = cur->link;//获取链表第一个节点
while (cur != NULL)
{
count++;
cur = cur->link;
}
cur = L->link;
if (k > count) { cout << -1 << endl; }//判断合法性
if (k < 1) { cout << -1 << endl; }
for (int j = 0; cur != NULL; cur = cur->link,j++)
{
if (j == n - k) { cout << cur->data; break; }
}
return 0;
}
5
1 2 3 4 5
1->2->3->4->5
3
3
遍历一次代码:
```cpp
/// <summary>
/// 解法步骤
/// </summary>
/// <returns></returns>
int k; cin >> k;
Node<em> p = L->link, </em>q = L->link;//p,q指向第一个节点
int ans = -1; int j = 0;
while (p!= NULL)
{
if (j == k) { q = q->link; }
else { j++; }
p = p->link;
}
if (j==k) //判断合法性
{
ans = q->data;
}
cout << ans;</p>
<pre><code> 结果
```cpp
5
1 2 3 4 5
1->2->3->4->5
5
1
三、总结
本题满分15分,多次遍历最多10分,一次遍历15分。可以使用双指针的做法实现一次遍历,在链表的题目里面,双指针场景很多,一定要掌握。
- THE END -
最后修改:2024年2月11日