寻找单链表的倒数第四个节点

本文介绍了一种使用快慢指针的方法来查找链表中倒数第四个节点的具体实现过程。通过让快指针先走四步,然后与慢指针同步移动,直到快指针到达链表末尾,此时慢指针恰好指向倒数第四个节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
快慢指针。先让快指针先走4步,找到第四个结点。然后让快慢指针同时走,每次一步。当快指针走到最后一个结点时,两个指针再同时走一步,慢指针指向倒数第4个元素。
*/ 
#include <iostream>
#include <string>

using namespace std;     //使用命名空间 

struct node            //定义一个结构体 
{
	char val;          //定义一个字符型变量 
	struct node * next; //定义一个结构体指针 
};

typedef struct node NODE;   //为结构体类型重新创建一个名称 
typedef NODE * Link;        //为结构体指针重新创建一个名称 

/*遍历整个链表*/
void out_link(Link pHead)
{
	if(!pHead)      			  //入口参数检查 
		return ;  
	Link temp = pHead->next;      //定义一个临时指针,指向头指针下一个,方便下一次遍历 
	while(temp)                   //如果temp指针到最后指向NULL后,即跳出循环 
	{ 
		cout<<temp->val;          //输出该指针指向的节点的数值 
		temp = temp->next;        //指针指向下一个 
	}	
	cout<<endl;
}

/*寻找倒数第四个节点的字符*/
Link find_fourth_node(Link pHead)
{
	if(!pHead)
		return NULL ;
	Link pFast = pHead;        //快指针 
	Link pSlow = pHead;		   //慢指针 
	int num = 4;        //快指针先走四步 
	while(num--)
	{
		pFast = pFast->next;
		if(!pFast)          //快指针还未走完,就结数了 
		{
			return NULL;    //返回0地址 
			break;          //跳出循环 
		}
	}
	while(pFast)            //让快指针走到链表的最后一个 
	{
		pFast = pFast->next;   //快指针和慢指针同时走 
		pSlow = pSlow->next;   
	}
	return pSlow;       //返回慢指针所在位置 
} 

/*创建一个链表,传入一个字符串*/ 
Link create(string & str_link)   
{
	int len = str_link.length();   //计算出这个字符串的长度 
	Link pHead = new node();       //用new运算符在堆上分配一个结构体的大小的节点 
	pHead->next = NULL;            //头节点里面的结构体指针指向NULL 
	Link preNode = pHead;          //定义一个结构体指针指向要插入节点的前一个 
	for(int i=0;i<len;i++)         //实现字符串中的字符循环插入 
	{
		Link pNode = new node();  //在堆上分配一个新的节点  
		pNode->val = str_link[i]; //插入字符 
		pNode->next = NULL;        //将新分配的节点中的结构体指针指向NULL 
		preNode->next = pNode;    //实现新的节点实现尾插
		preNode = pNode;          //将preNode指针指向该链表的最后一个 
	}
	return pHead;                 //返回链表头指针指向的位置 
}
void test()
{
	string str;
	cout<<"输入一个字符串:\n";
	cin>>str;
	Link pHead = create(str);     //创建一个链表,将字符串中的每个字符分配到每个节点,返回头指针的位置	
	out_link(pHead);      		  //遍历整个链表 
	Link pNode = find_fourth_node(pHead) ;  		  //寻找倒数第四个节点的字符 
	if(pNode)
		cout<<"倒数第四个节点的字符为"<<pNode->val<<endl; 
	else
		printf("该链表的节点个数不足四个!\n");
} 

int main(int argc,char **argv)
{
	test();     				//测试输出倒数第四个节点的字符 
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值