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。