Java实现单向链表反转

环境:

Java: jdk1.8.0_91

public class LinkedListTest {

    public static void main(String[] args) {
        Node A = new Node("A");
        Node B = new Node("B");
        Node C = new Node("C");
        Node D = new Node("D");
        Node E = new Node("E");
        Node F = new Node("F");
        A.next = B;
        B.next = C;
        C.next = D;
        D.next = E;
        E.next = F;
        print(A);

        LinkedListReversor reversor = LinkedListReversor.RECURSION;
        System.out.println(reversor.getStrategy() + ":");
        Node tmp = reversor.execute(A);
        print(tmp);

        reversor = LinkedListReversor.NO_RECURSION;
        System.out.println(reversor.getStrategy() + ":");
        print(reversor.execute(tmp));
    }

    private static void print(Node node) {
        while (node != null) {
            System.out.print(node.value);
            node = node.next;
            if (node != null) {
                System.out.print("->");
            } else {
                System.out.println();
            }
        }
    }

}

class Node {
    public String value;
    public Node next;

    public Node(String value) {
        this.value = value;
    }
}

enum LinkedListReversor {
    RECURSION("递归") {
        @Override
        public Node execute(Node node) {
            Node prev = null;
            if (node == null || node.next == null) {
                prev = node;
            } else {
                Node tmp = execute(node.next);
                node.next.next = node;
                node.next = null;
                prev = tmp;
            }
            return prev;
        }
    },
    NO_RECURSION("非递归") {
        @Override
        public Node execute(Node node) {
            Node prev = null;
            while (node != null) {
                Node tmp = node;
                node = node.next;
                tmp.next = prev;
                prev = tmp;
            }
            return prev;
        }
    };
    private String strategy;

    private LinkedListReversor(String strategy) {
        this.strategy = strategy;
    }

    public abstract Node execute(Node node);

    public String getStrategy() {
        return strategy;
    }
}
时间: 2024-10-10 08:58:46

Java实现单向链表反转的相关文章

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾

小菜鸟的单向链表反转

关于单向链表的反转想必大家都很熟了,以前一直用递归的方法写的,还是挺好写的,但是后来又在网上瞄了一眼非递归方法的实现,当时以为那个代码是正确的,也没验证,后来就不了了之. 昨天下午开始写这个代码,最后老发现出问题,今天早上起来理了一遍,终于发现症结所在. 举个例子吧: 1->2->3->4->5->6       我反转后的结果应该是: 6->5->4->3->2->1 我的算法是这样的(语死早,大家不要笑,我就用过程图表达吧): 1->2

php 单向链表反转 reverse (没有空的头结点)

* 参照php标准库设计接口 http://php.net/manual/en/class.spldoublylinkedlist.php * 反转单向链表 reverse方法, 其他的方法为了方便测试 <?php /** * Created by PhpStorm. * User: Mch * Date: 8/11/18 * Time: 00:25 */ class Node { public $value; public $next; public function __construct(

单向链表反转,就地逆置与递归反转(无表头结点)

最近在看链表,今天刷到一道链表的反转题,链表反转可以说是基础操作,但是可提供的方案也有很多,简单通过了该题后又学习了一下递归反转,现在把三种方法都公开出来做一个总结. 1.就地逆置 2.单参数的递归逆置 3.双参数的递归逆置 一.就地逆置 方法:头插. 由于这里是不带表头结点的单向链表,所以头插会稍微复杂一点,不想往下看的小伙伴也可以直接选择定义一个临时表头结点从头结点开始遍历链表将每一个链表头插,最后将头结点指向表头结点的next指针域,最后free掉那个表头结点即可. 虽然不带表头结点头插会

数据结构——Java实现单向链表

结点类: 1 /** 2 * @author zhengbinMac 3 * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. 4 */ 5 public class OnelinkNode { 6 // 保存结点的值 7 public int data; 8 // 保存后继结点的引用 9 public OnelinkNode next; 10 // 构造值为k的结点 11 public OnelinkNode(int

Java实现单链表反转

本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { 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); node1.next = node2; node2.next

java基础编程——链表反转

题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目代码 /** * @program: JavaCode * @description:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. * @author: Yukai Fan * @create: 2018-08-15 20:28 **/ public class LinkListPrint { public static void main(String[] args) { LinkListPri

Java实现单向链表

/* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */class LNode{//这个写法已经非常固定了 设置两个属性分别用set函数和get函数来得到这两个属性 private int data; private LNode next;//这个和String应该比较相似的用法,类名用来表示数据类型,表示next的数据类型也是节点 public void setData(int data){

Java实现单向链表的增删改查

class Node { public int val; public Node next; public Node(int val) { this.val = val; } } class ListHead { public int count ; public Node next; public ListHead() { this.count = 0; this.next = null; } } class List { public ListHead head; private Node