LeetCode:链表逆置

来源:互联网 发布:安正时尚集团 知乎 编辑:程序博客网 时间:2024/05/18 03:08

Reverse Linked List


1、题目描述:
Reverse a singly linked list.

click to show more hints.

Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?


2、代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    // void reList(ListNode * &head,ListNode *pre)// recursively    // {    //     if(head->next)    //     {    //         ListNode *p=head->next;    //         head->next=pre;    //         pre=head;    //         head=p;    //         reList(head,pre);    //     }    //     else    //     {    //         head->next=pre;    //     }    // }    ListNode* reverseList(ListNode* head) {        if(!head||!(head->next))        {            return head;        }        // ListNode *pre=nullptr;               //iteratively         // for(ListNode *p=head;p!=nullptr;)        // {        //     ListNode *p1=p->next;        //     p->next=pre;        //     pre=p;        //     p=p1;        // }        // return pre;        // reList(head,nullptr);        // return head;        /*参考后面别人代码所写recursively*/        // ListNode *p=reverseList(head->next);        // head->next->next=head;        // head->next=nullptr;        ////执行后会被调用函数再次修改,由里到外        // return p;        /*参考后面别人代码所写iteratively*/        ListNode *pre=nullptr,*cur=head;        while(cur)        {            ListNode *nextNode=cur->next;            cur->next=pre;            pre=cur;            cur=nextNode;        }        return pre;    }};

3、总结:
reverseList函数注释掉的第一部分,是我写的循环方法。reList函数是我写的递归辅助函数。在看了后面别人提供的代码后,又重写了一份。reverseList函数注释掉的第二部分,是递归方法,简洁啊,后面就是循环方法。
A、变量的定义要有一定含义。
B、特殊情况先排除。
C、递归理解:

        // head->next->next=head;        // head->next=nullptr;        ////执行后会被调用函数再次修改,由里到外

在链表尾部,tail->next=head,head->next=nullptr,返回调用函数head->next=head1,head1->neaxt=nullptr。

0 0
原创粉丝点击