Leetcode:206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

Leetcode:206. 反转链表_第1张图片

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

Leetcode:206. 反转链表_第2张图片

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

双指针的解法:

  • 初始化:cur指向head,pre为cur的前一个元素并且为null;

  • 然后:tempNode用于保留cur.next。然后改变cur的指向,cur.next指向pre;

  • 最后:pre 前移到cur;cur前移到temp。

class Solution {
   public ListNode reverseList(ListNode head){
        
        ListNode cur = new ListNode();
        cur=head;//cur指向头指针
        ListNode pre=null;//pre是cur的前一个节点,指向空;
        
        while (cur !=null){//循环终止条件;
            
            ListNode tempNode=cur.next;//tempNode 用于保存cur.next节点;
            cur.next=pre;//翻转指向;
            pre=cur;//pre向前移动一位;
            cur=tempNode;//cur前移一位
            
        }

        return pre;
    }
}

递归的解法:与双指针的思路相同;注意递归出口:cur ==null ;直接返回pre;

class Solution {
    public ListNode reverseList(ListNode head){
          
        return reverse(head,null);//初始化pre 和cur
      }
      
      public ListNode reverse(ListNode cur,ListNode pre){
          if(cur==null){
              return pre;//递归终止条件;
          }
          
          ListNode tempNode=cur.next;
          cur.next=pre;
          return reverse(tempNode,cur);//递归到下一层;
      }
}

你可能感兴趣的:(Leetcode,链表,数据结构)