LinkedList——Reverse Linked List

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;
        
    }
};

你可能感兴趣的:(LinkedList——Reverse Linked List)