代码改变世界

面试题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;
}

运行结果: