Reverse a singly linked list.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
一、迭代方法
思路
1、将一个链表反转即改变每个节点的下一指针的指向,所以需要两个指针分别保存之前节点和当前节点,注意定义指向之前节点的指针时将其赋值为空指针,因为新链表的表尾需要指向NULL;
2、将当前节点指向前一节点之前额外需要一个指针记录当前节点的下一个位置,用与反转链表后更新当前节点的位置;
3、重复上述流程直到当前节点指向NULL,此时整个链表反转完毕,前一节点就是新链表的表头。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==nullptr||head->next==nullptr)
return head;
ListNode* pre=nullptr;
ListNode* cur=head;
ListNode* rear=nullptr;
while(cur!=nullptr)
{
rear=cur->next;
cur->next=pre;
pre=cur;
cur=rear;
}
return pre;
}
};