剑指 Offer 24. 反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
解法一:双指针(简单)
思路:直接让后一个指向前一个
解法二:递归
思路:将链表看作已经反转和还未反转两个部分
代码:
/**
-
Definition for singly-linked list.
-
public class ListNode {
-
int val; -
ListNode next; -
ListNode(int x) { val = x; } -
}
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(headnull){
return null;
}
return reverse(null,head);
}
//递归模板:终止条件,递归调用,逻辑处理
public ListNode reverse(ListNode p,ListNode q){ //p已经反转,q还未反转
if(qnull){
return p;
}
ListNode ret = reverse(q,q.next); //递归调用先于逻辑处理:递归总是要回溯的,回溯时进行逻辑处理才是正确的
q.next = p; //逻辑处理
return ret; //调用一次就执行一次q.next = p;完成反转}
}

浙公网安备 33010602011771号