/*
快慢指针。先让快指针先走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;
}
寻找单链表的倒数第四个节点
最新推荐文章于 2024-10-21 20:08:59 发布