面试题10:查找单链表的中间结点
2016-03-29 22:04 Keiven_LY 阅读(1296) 评论(0) 编辑 收藏 举报思路1:首先求出单链表的总长度n,然后从链表的头节点开始遍历,当遍历到n/2个节点时,即为链表的中间结点。(面试题9:单链表中倒数第k个结点 的思路1)
思路2:设置两个工作指针*p1、*p2都指向单链表的头节点。其中*p1的移动速度是*p2的2倍。当p1指向尾节点的时候,p2正好指向链表的中间结点。(典型的快慢指针的思想)
思路2的功能函数:
/* 获取链表的中间结点 */ Node *getMidNode(Node *head) { Node *p1, *p2; if(head == NULL || head->next == NULL) //链表为空或是单结点链表直接返回头结点 return head; p1=p2=head->next; while(1) { if(p1->next != NULL && p1->next->next != NULL) { p1 = p1->next->next; p2 = p2->next; } else break; } return p2; }
完整可执行程序:
#include<iostream> #include <stack> #include<stdlib.h> #include<time.h> using namespace std; typedef struct node { int data; struct node *next; }Node; /* 创建含有n个结点的单链表 */ Node *CreateListHead(int n) { Node *head; head=(Node *)malloc(sizeof(Node)); /*创建头结点*/ Node *q = head; /* 初始化随机数种子 */ srand(time(0)); //srand函数在stdlib.h头文件中,time函数在time.h头文件中 for(int i=0; i < n; i++) { Node *p = (Node *)malloc(sizeof(Node)); p->data = rand()%100+1; //随机生成100以内的数字 p->next = q->next; q->next = p; q = p; } q->next = NULL; return head; } /****打印单链表******/ void print(Node *head) { Node *p; if(head->next==NULL) { cout << "The LinkList is Empty !" <<endl; return; } p=head->next; while(p!=NULL) { cout << p->data << " " ; p=p->next; } } /* 获取链表的中间结点 */ Node *getMidNode(Node *head) { Node *p1, *p2; if(head == NULL || head->next == NULL) //链表为空或是单结点链表直接返回头结点 return head; p1=p2=head->next; while(1) { if(p1->next != NULL && p1->next->next != NULL) { p1 = p1->next->next; p2 = p2->next; } else break; } return p2; } int main() { Node *SingleLinkList = NULL; int length; cout << "Please input the length of LinkList: "; cin >> length; SingleLinkList = CreateListHead(length); cout << "The new created LinkList as below: " ; print(SingleLinkList); cout << endl; Node *midNode = NULL; midNode = getMidNode(SingleLinkList); cout << "该链表的中间结点是: " << midNode->data <<endl; system("pause"); return 0; }
运行结果: