单链表反转

链表题中,链表反转应该是出现频率最高的一道题。

如何实现?

我们分析一下,一个链表,【1, 2,3,4,5】,反转成 【5,4,3,2,1】,我们可以适应循环。

循环的过程中,将当前节点的 next 指向上一个 pre 节点,假设当前节点是 2,那么反转之后,2 的 next 就是 1。但是这是一个单向链表,他是没有 pre 属性的 😔。

怎么办呢?

我们可以在迭代中保存 pre,就能解决没有 pre 属性这个问题。另外,第一个节点是没有 pre 的,因此我们需要虚拟一个 null 就行,因为第一个节点反转之后,他的 next 一定是 null。

代码如下:

/**
 * 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 pre = null;
        ListNode current = head;
        ListNode newHead =  head;
        while(current != null) {
            ListNode next = current.next;
            if(next == null) {
                newHead = current;
            }
            current.next = pre;
            pre = current;
            current = next;
        }
        return newHead;
    }
}

代码中,我们定义了一个 pre 节点,为了有返回值,我们也定义了一个 newHead 对象,当循环到最后时,最后一个节点就是 新的 head,所以称之为 newHead。

每次遍历时,都先保存当前节点的 next 节点,防止指针在后面错乱。然后,将 pre 节点指向当前节点的 next,然后再讲当前节点变成 pre 节点,供下次循环使用,最后,再将 next 节点变成 current 节点,供下次循环。

迭代反转就是这么简单。他的时间复杂度是 On,空间复杂度是 O1。

当然,还有一种递归方式(空间和时间复杂度都不如循环,纯粹为了炫技),后面会单独搞个文章来讲。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单链表反转是当前节点与上一个节点建立关系,依次反复,最后输出新的头节点的过程。 准备工作:定义一个链表的节点对象:...
    小胖学编程阅读 732评论 0 5
  • 转载自http://blog.csdn.net/fx677588/article/details/72357389...
    杰伦哎呦哎呦阅读 1,138评论 0 0
  • 说两句 单链表是一种基本的数据结构,也是现在技术面试经常考到东西(我曾在这跌倒过,那叫个惨,谁让我们平时并不注重这...
    爱编程的凯哥阅读 395评论 0 4
  • 数据结构与算法 1. 单链表的结点结构 data域:存储数据元素信息的域称为数据域; next域:存储直接后继位置...
    凯玲之恋阅读 1,596评论 0 2
  • 主要介绍链表的简单用法以及单链表反转。网上的实现有很多,使用 OC/C 来实现的没有几个。 一、链表的基本用法 链...
    CoderHG阅读 1,437评论 0 8