学习以及成为想要成为的人day12

输出链表倒数第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;
}

小结

又学到了一招

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值