Java单链表的反转

原创 2017年08月13日 13:11:46

前段时间有同事面试,给面试的人都提一个算法问题那就是单链表的反转,好多小伙伴都不会,或者表示一听算法就懵逼了,自己写了一个。就是5-4-6-8-9-1-2-7,反转输出7-2-1-9-8-6-4-5,我自己写的反转有两种方式。一种是递归,一种是遍历,也是很普通的两种方式。
<一>递归的方式
先看图
这里写图片描述

先解释一下一个Node有data和next,data是数据,next是指向下一个节点,相当于C中的指针了。我们先放3个数据,图中的1-3是一次完整的操作。
先想一哈这个怎么写,既然递归,而且是链表就要传入一个头结点,就是图中的A节点,递归中要判断,下一个节点的是不是空节点来,来决定要不要再次调用自己去处理数据。
具体的递归方法怎么写,看图里面的数据是如何处理的,
注意的3点;
1.判断是不是null节点,也就是找到最后一个节点,并且返回出来作为第一个节点
2.找到最后一个节点后,将最后一个节点的next指向自己,并将自己的next复制为null,将自己设置为最后一个节点
3.递归是重复调用自己的

这个是node节点


public class Node {
    private int Data;
    private Node Next;

    public Node(int data) {
        this.Data=data;
    }
    public int getData() {
        return Data;
    }
    public void setData(int data) {
        Data = data;
    }
    public Node getNext() {
        return Next;
    }
    public void setNext(Node next) {
        Next = next;
    }
}

具体的递归方法看图的操作去写

public Node ergodic(Node heade){
//1.判断是不是null节点,也就是找到最后一个节点,并且返回出来作为第一个节点
if(heade==null||heade.next==null){
return heade;//判断是最后一个节点,直接将最后一个节点往上返回
}
//不断调用自己找见最后一个节点
Node result=ergodic(heade.getNext());
//2.找到最后一个节点后,将最后一个节点的next指向自己,并将自己的next复制为null,将自己
//设置为最后一个节点
heade.getNext().SetNext(heade);
heade.setNext(null);

return result;
}

具体的执行大概说一下调用ergodic
将A作为heade传入,判断是不是最后一个节点,
调用ergodic并传入A的next节点即B节点,判断B节点不是最后一个节点,调用ergodic传入B节点的next,即C节点,C节点是最后一个节点,returnC节点,result是C节点。此时的heade是B节点,将B节点的next节点的next设置为B节点,就是C节点next设置为B节点**,header现在还是B节点,将B节点的next设置为null,return了C节点,此时的result是刚才返回的C节点,heade是A节点,将A节点的next节点的next设置为A节点,即B节点的next设置为A节点,A节点的的next设置为null,返回C节点。
到此整个递归就走完了。返回的是C节点,即图中3的结果。c指向b,b指向a,反转结束了。

<一>遍历反转

就是将B节点next中的节点暂时记录,将A节点和B节点,的next重新设置,A节点的next设置为null,B节点的next设置为A节点,再进行下一轮的互换,C节点和B节点的next互换,C节点的Next指向B节点,

具体代码

public static Node ergodic(Node head) {

        if (head == null) {
            return head;
        }
        Node pre=head;//第一个节点
        Node cur=head.getNext();//第二个节点
        Node tmp;
        while (cur!=null) {

        tmp=cur.getNext();//第三个节点
        cur.setNext(pre);//将第二个节点的指针指向第一个节点
        //互换位置
        pre=cur;//第二个节点成为前一个节点
        cur=tmp;//第二个节点的下一个节点为第三个节点
        }
        head.setNext(null);
        return pre;
    }

整体的代码:

import com.sun.xml.internal.bind.util.Which;

public class Listflip {

    public static void main(String[] args) {

        Node heaedNode = new Node(0);
        Node heaedNode1 = new Node(1);
        Node heaedNode2 = new Node(2);
        Node heaedNode3 = new Node(3);
        Node heaedNode4 = new Node(4);

        heaedNode.setNext(heaedNode1);
        heaedNode1.setNext(heaedNode2);
        heaedNode2.setNext(heaedNode3);
        heaedNode3.setNext(heaedNode4);

        // 递归反转前
        Node node = heaedNode;
        while (node != null) {
            System.out.println(node.getData() + "");
            node = node.getNext();
        }

        // 递归反转后
        node = ergodic(heaedNode);
        while (node != null) {
            System.out.println(node.getData() + "");
            node = node.getNext();
        }
    }

    // 递归反转
    public static Node reversel(Node head) {

        if (head == null || head.getNext() == null) {
            return head;
        }
        Node renode = reversel(head.getNext());
        head.getNext().setNext(head);
        head.setNext(null);
        return renode;
    }

    // 遍历反转
    public static Node ergodic(Node head) {

        if (head == null) {
            return head;
        }
        Node pre=head;//第一个节点
        Node cur=head.getNext();//第二个节点
        Node tmp;
        while (cur!=null) {

        tmp=cur.getNext();//第三个节点
        cur.setNext(pre);//将第二个节点的指针指向第一个节点
        //互换位置
        pre=cur;//第二个节点成为前一个节点
        cur=tmp;//第二个节点的下一个节点为第三个节点
        }
        head.setNext(null);
        return pre;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

单链表反转的两种实现(Java)

递归法 遍历法 LinkedList的反转递归法经历了很多面试,面试官最爱考察的算法无非是斐波那契数列和单链表反转,尽管是这些都是基础知识,然而我对单链表反转有更多的想法。 递归法是我早期最爱在面试...

java单链表反转

java 单链表反转因为面试考到了一些算法,也都忘的差不多了,学习了单链表之后,想把内容下来。这篇文章主要介绍什么是单链表以及单链表的反转方式:链表定义:链表是一种递归的数据结构,它或者为空(null...

Java实现单链表反转

本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void m...

java 单链表反转详解

java 实现单链表反转:class node{ int data; node next; public node(int data){ this.data=d...

Java单链表反转 详细过程

Java单链表反转 Java实现单链表翻转 使用递归法实现单链表反转,使用遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。     【尊重原创,...

java 实现单链表的反转

#Person 是一个链表的结构 package com.java.demo.link;   public class LinkList {       /**      * 建立一个...
  • mdj_bj
  • mdj_bj
  • 2012年07月27日 09:56
  • 1239

java不用api实现单链表反转(二)

这篇博客主要讲述反转链表相关思路。两种方法:时间复杂度均为O(n),空间复杂度均为O(1)...

单链表反转--Java实现

单链表的反转是一个在面试中比较常见的问题。由于其实现相对简单,甚至有些现场面的面试官要求手写单链表反转的代码。 这里使用一个实例来简单的介绍单链表的反转的实现...

数据结构之Java单链表反转

本文为数据结构基础,研究得不是很深。用Java实现单链表的反转,虽然本文研究得不是很深,但是因为是数据结构,所以必须是在对Java内存比较清楚的情况下才能真正的搞懂吃透,如果对Java内存不够清楚,那...

List-LinkedList 单链表就地反转

  • 2012年05月09日 10:16
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java单链表的反转
举报原因:
原因补充:

(最多只允许输入30个字)