题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
解法一:双指针(简单)
思路:直接让后一个指向前一个
解法二:递归
思路:将链表看作已经反转和还未反转两个部分
代码:
/**
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;完成反转
}
}
原文:https://www.cnblogs.com/nickyBlog/p/13943905.html