您的位置:首页 > 其它

LeetCode:链表逆置

2016-07-10 20:23 459 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 链表