(剑指offer)面试题24. 反转链表

题目

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

思路

双指针法:定义两个指针cur和pre,进行局部翻转,然后向前移动。

  • 定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。
  • 每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转
  • 局部反转完成之后, prepre 和 curcur 同时往前移动一个位置
  • 循环上述过程,直至 prepre 到达链表尾部

递归法:一直递归进行对head.next的翻转。

  • 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ret 。
  • 每次函数在返回的过程中,让当前结点的下一个结点的 next指针指向当前节点。
  • 让当前结点的 next指针指向 NULL,从而实现从链表尾部开始的局部反转
  • 当递归函数全部出栈后,链表反转完成。

代码

public static class ListNode {
      int val;
     ListNode next;
     ListNode(int x) { val = x; }
  }

  /**
   * 递归法
   * @param head 头结点
   * @return
   */
  public static ListNode reverseList1(ListNode head) {
    if (head == null || head.next == null) {
      return head;
    }
    ListNode re = reverseList1(head.next);//递归
    head.next.next = head;
    head.next = null;
    return re;
  }

  /**
   * 双指针法
   * @param head 头结点
   * @return
   */
  public static ListNode reverseList2(ListNode head) {
    ListNode cur = null;
    ListNode pre = head;
    while (pre != null){
      //pre与cur进行局部翻转
      ListNode tempnode = pre.next;
      pre.next = cur;
      cur = pre;
      pre = tempnode;
    }
    return cur;
  }
展开阅读全文
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值