代码改变世界

面试题7:单链表的反转/逆序

2016-03-28 22:26  Keiven_LY  阅读(432)  评论(0编辑  收藏  举报

题目描述:

实现一个函数,输入一个单链表的头结点,反转该链表并输出反转后链表的头结点。

基本思路:

比如链表:1->2->3->4->5->6

1.定义三个指针pcur,pnext,prev;

2. pcur指向1, pnext指向2, prev指向3;

3. 首先pcur->next=NULL(第一个结点作为反转后的最后一个结点)

4. 然后pnext->next=pcur;让pcur=pnext,pnext=prev;

5. 这时1<-2  3->4->5->6 pcur指向2,pnext指向3,prev指向4

6. 重复第4步(pnext->next=pcur,pcur=pnext,pnext=pprev,此时1<-2<-3 4->5->6 依次类推)

功能函数:

/*     单链表的反转    */
Node *ReverseLinkList(Node *head)
{
    if(head == NULL || head->next == NULL) 
        return head;
    Node *pcur, *pnext, *prev;
    pcur = head->next;  //pcur保存第一个结点
    pnext = pcur->next; //pnext保存第二个结点
    pcur->next = NULL; //反转后第一个结点变为最后一个结点
    while(pnext != NULL)
    {
        prev = pnext->next;
        pnext->next = pcur;
        pcur = pnext;
        pnext = prev;
    }
    head->next = pcur; //反转后的第一个结点为原链表的最后一个结点
    return head;
}

完整可执行程序:

#include<iostream>
#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;
}

/*     单链表的反转    */
Node *ReverseLinkList(Node *head)
{
    if(head == NULL || head->next == NULL) 
        return head;
    Node *pcur, *pnext, *prev;
    pcur = head->next;  //pcur保存第一个结点
    pnext = pcur->next; //pnext保存第二个结点
    pcur->next = NULL; //反转后第一个结点变为最后一个结点
    while(pnext != NULL)
    {
        prev = pnext->next;
        pnext->next = pcur;
        pcur = pnext;
        pnext = prev;
    }
    head->next = pcur; //反转后的第一个结点为原链表的最后一个结点
    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;
    }
}

int main()
{
    Node *SingleLinkList = NULL;
    int length;

    cout << "Please input the length of LinkList: " <<endl;
    cin >> length;
    SingleLinkList = CreateListHead(length);
    cout << "The new created LinkList as below: " <<endl;
    print(SingleLinkList);
    cout << endl;

    cout << "链表翻转后的结果为:" << endl;
    ReverseLinkList(SingleLinkList);
    print(SingleLinkList);
    cout << endl;
    system("pause");
    return 0;
}

运行结果: