Java,  算法和数据结构

LeetCode206题-翻转链表

零 题目分析

Given the head of a singly linked list, reverse the list, and return the reversed list.

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一 题解思路

对于初始链表:1–>2–>3–>4–>5–>NULL,我们需要获取一个5–>4–>..1->NULL的链表。考虑通过栈这种数据结构,在不考虑通过借助栈或其它数据结构的情形下,让某个节点指向其前一个节点,这样实现反转的思路。可是,没有指向前1个节点的指针,我们人为构建出来1个pre节点,让它指向当前节点的前一个节点,curr指向当前节点,next指向当前节点的下一个节点。

二 代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
     ListNode prev=null;
     ListNode curr=head;
     while(curr!=null){
         ListNode next=curr.next;
         //当前节点的下一个指向前一个节点,实现了当前节点和它之前的节点的反转
         curr.next=prev;
         //令其前一个节点指向当前节点,
         prev=curr;
         //当前节点指向下一个节点
         curr=next;
     }
//     最后返回prev,而不是curr节点,因为,最后curr一定是等于NULL时,就退出while循环的
        return prev;
    }
}

三 递归实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
     //1 先写出基本情况的代码,不依赖于其它情况都能计算出来的结果
      //如果链表为空,或者链表只有1个元素,那么翻转之后,还是它自身
      if(head==null||head.next==null){
        return head;
      }
      //2朝着正确的方向,将问题简化1步的方向前进,假定头节点已经翻转,接下来要翻转除头节点之外的链表
      ListNode retNode=reverseList(head.next);
      //3返回的retNode是除头节点之外的所有节点,且已经翻转之后的链表的头节点
      //1-->2-->3--4>-->5
      //1-->2<--3<--4<--5
      //这里的retNode其实就是指向了5.我们的head还是指向了1,且head.next=2
      //3 我们让head.next.next=head。其实就是让2-->1。仔细体会,这是神来之笔的一句代码。
      head.next.next=head;
      //4最后让head.next=null,即让1指向NULL,1充当链表的最后1个节点
      head.next=null;
      retrun retNode;
    }
}

留言