力扣(LeetCode)-206题反转链表(Java)

力扣(LeetCode)-206题反转链表(Java),第1张

力扣(LeetCode)-206题反转链表(Java)

206题-反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]

方法一:头插法
新建一个大小和原链表完全相同的新链表,边遍历原链表,边在新链表将新建节点头插,返回新链表头节点

public ListNode reverseList(ListNode head) {
  //判断边界条件
  if(head == null||head.next == null){
     return head;
  }
  //新建一个链表
  ListNode newHead = null;
  while(head != null){
     //遍历原链表,新建节点,头插
     ListNode node = new ListNode(head.val);
     node.next = newHead;
     newHead = node;
     head = head.next;
  }
     return newHead;
}

方法二:递归法

public ListNode reverseList(ListNode head) {
 if (head == null || head.next == null) {
       return head;
  }
    // 此时第二个节点以及之后节点的反转工作交给reverseList()执行,并且,返回的链表头就是最终的返回值
    ListNode secNode = head.next;
    ListNode newHead = reverseList(head.next);
    secNode.next = head;
    head.next = null;
    return newHead;
}

方法三:原地移动原链表
实际上就是将相邻的两个节点互换,因此需要两个遥控器指向两节点

 // 2.原地移动原链表
    public ListNode reverseList(ListNode head) {
       if (head == null || head.next == null) {
           return head;
        }
       ListNode prev = null;
       ListNode cur = head;
       while (cur != null) {         
          // 使用next暂存下一个 要处理的节点
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4996233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存