反转链表

来源:互联网 发布:航海王娜美工口h本子 编辑:程序博客网 时间:2024/06/05 20:51

参考《剑指Offer》

题目:

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:

struct ListNode{    int m_nkey;    ListNode* m_pNext;};

要点

1、链表的建立中由于需要改变头指针指向的值,所以要用双重指针。
2、反转的逻辑主要是让后面结点指向前面的结点,但是如果仅仅这样操作,链表就断了,无法继续向后操作。所以同时需要保存三个结点,前两个结点进行反转操作,后面一个结点用于保证链表的连续性。最主要的逻辑在代码中只是以下这一段:

ListNode* Reverse(ListNode* pHead)//链表的反转{    ListNode* pHead2=NULL;    ListNode* pNode=pHead;    ListNode* pPrev=NULL;    while(pNode!=NULL)    {        ListNode* pNext=pNode->next;        if(pNext==NULL)            pHead2=pNode;        pNode->next=pPrev;        pPrev=pNode;        pNode=pNext;    }    return pHead2;}

最终结果:

这里写图片描述

代码

#include<iostream>using namespace std;struct ListNode{    int key;    ListNode* next;};void Create(ListNode** pHead)//建立链表,由于此处需要改头指针指向的值,所以要用双向链表{    int n;    cin>>n;    ListNode* pNode=NULL;    ListNode* pPrev=NULL;    int k;    cin>>k;    pNode=new ListNode;    pNode->key=k;    *pHead=pNode;    pPrev=pNode;    while(--n)    {        cin>>k;        pNode=new ListNode;        pNode->key=k;        pPrev->next=pNode;        pPrev=pNode;    }    pNode->next=NULL;}void Print(ListNode* pHead)//输出链表中的值{    ListNode* pNode=pHead;    while(pNode!=NULL)    {        cout<<pNode->key<<endl;        pNode=pNode->next;    }}ListNode* Reverse(ListNode* pHead)//链表的反转{    ListNode* pHead2=NULL;    ListNode* pNode=pHead;    ListNode* pPrev=NULL;    while(pNode!=NULL)    {        ListNode* pNext=pNode->next;        if(pNext==NULL)            pHead2=pNode;        pNode->next=pPrev;        pPrev=pNode;        pNode=pNext;    }    return pHead2;}int main(){    ListNode* p=NULL;    Create(&p);    Print(p);    cout<<endl;    Print(Reverse(p));    return 0;}
1 0
原创粉丝点击