单链表反转

来源:互联网 发布:mmd镜头数据哪里导入图 编辑:程序博客网 时间:2024/06/06 09:09

两种方法实现;

#include <iostream>using namespace std;struct ListNode{    int val;    ListNode * next;};void CreateList(ListNode * L,int n){    cin>>L->val;    n--;    for (int i = 0; i < n; i++)    {        ListNode * p = new ListNode;        cin>>p->val;        p->next = NULL;        L->next = p;        L = p;    }}//非递归ListNode * ReverseList(ListNode * pHead){    ListNode * pRevesedHead = NULL;//反转后的头结点    ListNode * pNode = pHead;//当前结点    ListNode * pPrev = NULL;//前一结点    while (pNode != NULL)//判断非空    {        ListNode * pNext = pNode->next;//下一结点(用pNext保存,避免链表断裂)        if (pNext == NULL)//如果只有一个结点        {            pRevesedHead = pNode;//则直接返回当前结点        }        pNode->next = pPrev;//反转操作        pPrev = pNode;//将前一结点指针后移到当前结点位置        pNode = pNext;//将当前结点指针后移到下一结点位置    }    return pRevesedHead;//返回}//递归ListNode * reverseList(ListNode *head){    //如果链表为空或者链表中只有一个元素    if(head == NULL || head->next == NULL)    {        return head;    }    else    {        //先反转后面的链表,走到链表的末端结点        ListNode *newhead = reverseList(head->next);        //再将当前节点设置为后面节点的后续节点        head->next->next = head;        head->next = NULL;                return newhead;    }}//主函数int main(){    ListNode * L = new ListNode;    L->next = NULL;    CreateList(L,5);    ListNode * p;//    p = ReverseList(L);p=reverseList(L);     while (p)    {        cout<<p->val<<' ';        p = p->next;    }    cout<<endl;    return 0;}
测试结果;



0 0
原创粉丝点击