Leetcode-206 :反转链表;

150 阅读1分钟

206反转链表

解法

  • 双指针
  • 递归

双指针解法

public ListNode reverseListNode(ListNode head){
  // 1: 边界条件;
  if(head==null || head.next ==null){
     return head;
  }
  // 2: 定义指针,便于在反转时,每次向后移动一个节点位;
  ListNode pre = null;
  ListNode curr = head;
  while(curr!=null){
    ListNode temp = curr.next;
    curr.next = pre;
    // pre 向后移动一位(注意,这一步特别容易犯错)
    pre = curr;
    // curr 也向后移动一位;
    curr = temp;
  }
  return pre;
  
}

递归解法

  • 将真的,递归解法,不是很好理解,但是,我们可以通过在关键代码处,打印log,帮助自己理解;
  public ListNode reverseList(ListNode head) {
        // 边界条件,也是递归终止的条件
        if(head==null||head.next==null){
            return head;
        }
        // 当前的头节点,如果原始链表是:1->2->3->4->5
        // 那么 curr 就是5,并且在递归的过程中不会变,不信,看log
        ListNode curr = reverseList(head.next);
        System.out.println("curr value : "+curr.val+", head value : "+head.val);
        // 例如:head 节点是4,
        // 节点4的下一个节点,就是节点5,
        // 节点5 的下一个节点连接到当前head节点
        head.next.next = head;
        // 将节点4和节点5 断开
        head.next = null;
        // 返回节点5
        return curr;
    }
  • LOG
  • curr value : 5, head value : 4
  • curr value : 5, head value : 3
  • curr value : 5, head value : 2
  • curr value : 5, head value : 1

ps: 递归解法,还是今天刻意学的,我还是比较倾向 双指针 解法,递归嘛。。你自己的思维要有深度才能理解,若是没有深度,怎么办呢? 憋着尿劲儿,使劲想吧,,,,画画图。。。不说了,笔者去上个厕所,,,,