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

来源:互联网 发布:交通枢纽大数据 编辑:程序博客网 时间:2024/05/18 01:54
/*快慢指针。先让快指针先走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; elseprintf("该链表的节点个数不足四个!\n");} int main(int argc,char **argv){test();     //测试输出倒数第四个节点的字符 return 0; } 

原创粉丝点击