LinkedList——Reverse Linked List
2019-03-30 本文已影响0人
BigInteger
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
题意
将一个链表翻转,有递归和非递归两种方法。
思路
递归
首先判断链表的长度,如果只有一项或为空,直接返回链表即可。
否则,先假装第k+1项及之后所有项都采用递归进行翻转,链表即为n1->n2->……->nk->nk+1-<……<-nm,那么需要将nk+1指向nk,这里用到的方法十分巧妙,只需nk->next->next=nk即可,因为nk->next就是nk+1,nk+1再指向nk。k为1时,nk再指向NULL。
非递归
对于n1->n2->……->nm,我们需要改为n1<-n2<-……<-nm,首先将result置为NULL,然后遍历链表时需要将当前的节点指向它的前驱,同时需要保存它的后继避免指向前驱之后就无法访问之前的后继了,指向前驱之后,需要更新result。过程为:1、LinekNode* result=NULL;然后设置prev和temp都是第一个节点,当prev不为空时,
prev->next=result;
result=prev;
temp=temp->next;
prev=temp;
代码
/**
* 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) {
//非递归解法
// ListNode *prev=head;
// ListNode *result=NULL;
// ListNode *temp=prev;
// while(prev)
// {
// temp=temp->next;
// prev->next=result;
// result=prev;
// prev=temp;
// }
// return result;
//递归解法
if(!head||!head->next) return head;
ListNode *temp=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return temp;
}
};