1、题目属于对基础的数据结构的操作,出现频次较高
题目描述:
2、解题思路如下:
双指针法:
解这道题,首先明白: 1、操作步骤 2、迭代 3、循环边界条件,确定初始值和循环终止条件 4、最后返回值 方法是什么呢,举例子, 循环终止条件:cur走到末尾,等于null值了,我希望他不执行循环结构中的语句了,直接返回了 初始值:开始的时候,走一遍循环,cur从头结点开始,pre等于null才能满足条件 最终返回值:cur走到末尾,等于null才结束,最后一次循环pre最后一个节点,所以返回pre
public class Solution206 {
public ListNode reverseList(ListNode head) {
// 解这道题,首先明白:
// 1、操作步骤 2、迭代
// 3、循环边界条件,确定初始值和循环终止条件
// 4、最后返回值
// 方法是什么呢,举例子,
// 循环终止条件:cur走到末尾,等于null值了,我希望他不执行循环结构中的语句了,直接返回了
// 初始值:开始的时候,走一遍循环,cur从头结点开始,pre等于null才能满足条件
// 最终返回值:cur走到末尾,等于null才结束,最后一次循环pre最后一个节点,所以返回pre
ListNode cur = head;
ListNode pre = null;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
// 迭代
pre = cur;
cur = temp;
}
return pre;
}
public static 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 Solution206_2 {
public ListNode reverseList(ListNode head){
ListNode pre = null;
ListNode cur = head;
return reverse(pre,cur);
}
public ListNode reverse(ListNode pre, ListNode cur) {
if(cur==null) return pre;
ListNode temp = cur.next;
cur.next = pre;
return reverse(cur, temp);
}
public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
}