链表:2009年题42
解法1:
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
typedef int ElemType;
typedef struct LNode
{
//每个结点中存储一个数据,以及下一个结点的地址
ElemType data;
struct LNode* link;
}LNode, * LinkList;
// 方法1:时间复杂度为O(n),空间复杂度为O(1)
int Find(LinkList L, int k)
{
if (k < 0)
return 0;
LNode* p = L;
// 先统计总结点数
int n = 0;
while (p != NULL)
{
p = p->link;
n++;
}
if (k > n)
return 0;
p = L;
// 倒数第k个结点就是正数第n-k+1个结点
for (int i = 0; i < n - k; i++) // i从0增加到n-k-1,循环n-k次,即向后遍历n-k个结点
{
p = p->link;
}
printf("%d ", p->data);
return 1;
}
解法2:
cpp
// 方法2:时间复杂度为O(n),空间复杂度为O(1)
/*
快、慢指针
快指针fast和慢指针slow开始均指向头结点,
快指针先向后遍历k个结点后(此时快慢指针之间的距离为k),快、慢指针再同时往后遍历,
当快指针fast走到链表的尾部时,慢指针slow指向的就是倒数第k个结点
*/
int Find(LinkList L, int k)
{
if (k < 1)
return 0;
LNode* fast = L;
LNode* slow = L;
for (int i = 0; i < k; i++)
{
if (fast != NULL) // 当fast=NULL时,表示链表中不存在倒数第k个结点
fast = fast->link;
}
if (fast == NULL)
return 0;
while (fast != NULL) // 当fast走到链表的末尾时,slow指向的就是倒数第k个结点
{
fast = fast->link;
slow = slow->link;
}
printf("%d ", slow->data);
return 1;
}