206. 反转链表

206. 反转链表

LeetCode_206

题目详情

解法一:迭代法

package com.walegarrett.interview;
/**
 * @Author WaleGarrett
 * @Date 2021/2/22 22:30
 */
import java.util.List;
/**
 * 题目描述:反转一个单链表。你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
 */
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
/**
 * 方法一:使用迭代的方式
 */
public class LeetCode_206 {
    public ListNode reverseList(ListNode head) {
        ListNode now = head;
        ListNode pre = null;
        while(now!=null){
            ListNode next = now.next;
            now.next = pre;
            pre = now;
            now = next;
        }
        return pre;
    }
}

解法二:递归法

  1. 相对于迭代法,使用递归法比较难以想到解决的办法。
  2. 使用递归法,我们首先需要重新定义一个方法,返回结果为新的头节点,参数为当前节点和当前节点的前置节点。
  3. 在每次递归的过程之后,需要设置当前节点的next指针指向前置节点pre。而递归中设置的中间节点result的作用仅仅是存储新的最终头节点并返回。
  4. 需要注意的是,在边界条件中,当当前节点为null时需要返回pre节点,而不是current节点,因为pre节点才是新的头节点。
/**
 * 解法二:递归解法,在回溯时需要设置next指针
 */
class LeetCode_206_2 {
    public ListNode reverseList(ListNode head) {
        return dfs(head, null);
    }
    ListNode dfs(ListNode current, ListNode pre){
        if(current == null)
            return pre;//这里返回的有点难以理解,这里其实是达到原始链表尾部就返回最后的那个元素。这个元素作为新链表的头指针。
        ListNode result = dfs(current.next, current);
        current.next = pre;
        return result;
    }
}
posted @ 2021-02-23 23:09  Garrett_Wale  阅读(51)  评论(0编辑  收藏  举报