输出链表倒数第k个节点
解决思路
一般来说,我们开始想到的解决办法就是遍历链表两次,第一次找到一共有几个元素,记为n,第二次用一个指针一直指到n-k+1这个位置,这个位置就是倒第k个节点的所在地。 说实话,这就是我开始想到的,还以为自己终于脑子灵光了一次,没想到这其实是最low的解法。哈哈哈其实只要能解决问题,这种暴力法也有可取之处的。当然今天大费口舌肯定不止介绍这一种解法。
比较妙的思路就是快慢指针,定义两个指针,一个先从头结点遍历,当走到k-1的位置处,这时我们让第二个指针从头节点开始遍历,这样两个指针之间永远隔着k-1个距离,直到第一个指针走到表尾,此时第二个指针所指的位置即为此链表倒数第k个节点。这个思想就相当于用了一把指针尺子,给链表截断了。
代码
/*
输出链表倒数第k个节点
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define OK 0
#define ERROR -1
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n){//尾插法建立单链表
L=new LNode;
L->next=NULL;
LNode *r=L;
printf("请输入%d个整数\n",n);
int num=0;
for(int i=0;i<n;i++){
LNode *p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&num);
p->data=num;
p->next=NULL;
r->next=p;
r=p;
}
}
int ReverseList(LinkList &L,int k){//实现算法的函数
LNode *fast=L;
LNode *low=NULL;
if(L==NULL&&k<=0)
return ERROR;
for(int i=0;i<k-1;i++){
if(fast)
fast=fast->next;
else
return ERROR;
}
low=L;
while(fast){
fast=fast->next;
low=low->next;
}
printf("此链表的倒数第%d个节点是:%d\n",k-1,low->data);
return OK;
}
int main(){
LinkList L;
int num=0;
CreateList_R(L,8);
ReverseList(L,3);
system("pause");
return OK;
}
小结
又学到了一招