剑指 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(q
    null){
    return p;
    }
    ListNode ret = reverse(q,q.next); //递归调用先于逻辑处理:递归总是要回溯的,回溯时进行逻辑处理才是正确的
    q.next = p; //逻辑处理
    return ret; //调用一次就执行一次q.next = p;完成反转

    }
    }

posted @ 2020-11-08 12:04  for_ward  阅读(34)  评论(0)    收藏  举报