首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >单向链表反转

单向链表反转

作者头像
一个架构师
发布2022-06-20 19:39:24
发布2022-06-20 19:39:24
5950
举报

如何将给定的单向链表反转变成一个新的单向链表.

例:

原链表: Head -> 1 -> 2 -> 3 -> 4 -> 5 -> null

目标链表: Head -> 5 -> 4 -> 3 -> 2 -> 1-> null

这个题目很容易实现,可以用数组转存,在逆序遍历数组;也可以使用递归,更可以暴力遍历.但这些都不是最优的,数组和递归都需要额外的存储空间;暴力遍历需要多次遍历,时间复杂度不是最优的.

下面分享两种比较省空间的方法:

1. 从原链表的头部一个一个取节点并插入到新链表的头部.

2. 每次都将原第一个结点之后的那个结点放在新的表头后面.

两种算法的思想是一致的,都是通过指针偏移做标记处理,其中一个指向新的单向链表,一个指向原链表节点;

而且两种算法也都只需要额外两指针就能达到目的;

如果你自己动手写代码的话,你会发现方法基本是相同的

附上代码,仅供参考:

代码语言:javascript
复制
public class ReverseLinkListNode {
    static Node reverse(Node head) {
        Node nextNode = head;
        Node firstNode = null;
        while (nextNode != null) {
            Node n = nextNode;
            nextNode = n.next;
            n.next = firstNode;
            firstNode = n;
        }
        return firstNode;
    }
 
 
    static String print(Node head) {
        StringBuilder sb = new StringBuilder("Head->");
        Node p = head;
        while (p != null) {
            sb.append(p.data).append("->");
            p = p.next;
        }
        sb.append("null");
        return sb.toString();
}
    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        System.out.println(print(node1));
        System.out.println(print(reverse(node1)));
    }
}
 
class Node {
    int data;
    Node next;
 
    public Node(int data) {
        this.data = data;
    }
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", next=" + next +
                '}';
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档