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;
}
}
解法二:递归法
- 相对于迭代法,使用递归法比较难以想到解决的办法。
- 使用递归法,我们首先需要重新定义一个方法,返回结果为新的头节点,参数为当前节点和当前节点的前置节点。
- 在每次递归的过程之后,需要设置当前节点的next指针指向前置节点pre。而递归中设置的中间节点result的作用仅仅是存储新的最终头节点并返回。
- 需要注意的是,在边界条件中,当当前节点为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;
}
}
Either Excellent or Rusty