数据结构与算法 | Leetcode 206:Reverse Linked List

pexels-photo-356807

原文链接:https://wangwei.one/posts/java-algoDS-reverse-linked-list.html

前面我们实现了几种常见的 链表 ,接下来,我们来聊聊如何实现 单链表 的反转。

链表反转

Leetcode 206: Reverse Linked List

示例:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

Input: NULL
Output: NULL

我们可以通过循环遍历和递归这两种方式来实现链表的反转。

遍历

思路

定义三个指针,分别为prev、curr、next,然后遍历所有node结点,并移动这三个指针,改变curr结点的next指向,指向prev结点,实现linkedList的反转。

LinkedList-Reverse-Iteratively

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        ListNode next = null;
        while(curr != null){
            next = curr.next;
            curr.next = prev;        
            prev = curr;
            curr = next;
        }
        head = prev;
        return head; 
    }
}

源码

递归

其实递归的实现方式和前面循环的方式非常相似,前者是通过循环来移动指针,后者是通过递归来移动指针。

定义一个递归接口,传入curr与prev节点作为参数,内部再将curr的作为下次递归调用的prev入参,curr.next 作为下次递归调用的curr入参。

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    public ListNode reverseList(ListNode head){
        return reverseRecursively(head, null);
    }
    
    public ListNode reverseRecursively(ListNode curr, ListNode prev) {
        if(curr == null){
            return null;
        }
        if(curr.next == null){
            ListNode head = curr;
            curr.next = prev;
            return head;
        }
        
        ListNode next1 = curr.next;
        curr.next = prev;
        
        ListNode head = reverseRecursively(next1, curr);
        return head;
    }
}

源码

这两种方式的时间复杂度均为O(n),空间复杂度均为O(1)。

参考资料

推荐阅读更多精彩内容

  • 链表删除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷阅读 6,004评论 4 35
  • 栈 1. 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被...
    程序员高级码农阅读 5,874评论 0 11
  • 什么是数组? 数组简单来说就是将所有的数据排成一排存放在系统分配的一个内存块上,通过使用特定元素的索引作为数组的下...
    启明_b56f阅读 731评论 0 0
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 1,979评论 0 3
  • 柳条挣脱了深厚的柳树皮,伸出脑袋,紧紧的呼吸湿漉漉的空气,天空也是非常识的柳条的心思,下起了绵绵的雨,它知道下得太...
    何鹏Alan阅读 153评论 0 1
  • 姓名:彭克军 20180525【日精进打卡第天】211天 【知~学习】 《六项精进》读0遍 共290遍 《大学》读...
    彭克军阅读 93评论 0 0
  • 最近项目中要加进去虚拟币和会员的功能 本以为特别简单不就是几十行代码嘛 但是内购做下来 可把我坑惨了 ...
    韶桦阅读 14,851评论 57 42
  • 在湖南的西南部,有一座城,自然风光不输张家界,人文情怀堪比凤凰古城,这就是怀化!自古以来,怀化就有“黔滇门户”、“...
    谢大鹏在旅途阅读 98评论 0 0