单链表实现链表逆序(详细思路)

2019-03-14  本文已影响0人  云鲸鱼rain

这道题,是我毕业前在北京找实习真实碰到的一个面试题。
逆序谁不会是吧,啥?不能用数组,不能用字符串,集合。只能用node自己构建链表。
嗯,好像有点儿印象,大学学数据结构的时候都学过。
但是那会儿真是全忘了,面试官很有耐心,还教了我。唉。:)


分三步,第一步先实现链表,第二步顺序打印,第三步逆序打印,逆序打印这里有两种方案。1. 链表反转,顺序打印。2. 链表不动,逆序打印

上代码
package test;

public class Node {
    
    public int value;
    public Node next;
    
    public Node(int i) {
        value = i;
        next = null;
    }
    
    /**
     * 添加节点
     * @param head 头节点
     * @param add 新添加的节点
     */
    public void add(Node head, Node add) {
        if (head == null)
            return;
        while(head.next != null) {
            head = head.next;
        }
        head.next = add;
    }
    
    /**
     * 顺序打印
     * @param head 头节点
     */
    public static void print(Node head) {
        if (head == null) {
            System.out.println("链表是空的");
        }
        while(head != null) {
            System.out.print(head.value + " ");
            head = head.next;
        }
    }
    
    /**
     * 逆序打印
     * @param head 头节点
     */
    public static void reversePrint(Node head) {
        if(head.next != null)
            reversePrint(head.next);
        System.out.print(head.value + " ");
    }
    
    /**
     * 反转链表
     * @param head 头节点
     * @return
     */
    public static Node reverse(Node head) {  
        if(head==null || head.next==null) return head;  
        Node p1 = head;  
        Node p2 = head.next;  
        p1.next = null;  
        while(p2.next != null) { 
            Node p3 = p2.next;
            p2.next = p1;  
            p1 = p2;  
            p2 = p3;
        }  
        p2.next = p1;  
        return p2;  
    }
}

package test;

public class NodeTest {

    public static void main(String[] args) {
        Node head = new Node(0);
        for(int i=1;i<=10;i++) {
            head.add(head, new Node(i));
        }
        Node.reversePrint(head);//逆序打印
        System.out.println();
        Node.print(Node.reverse(head));//反转链表并顺序打印
    }
}

add方法要点:

这个while循环是这里的关键,它的意思举个例子。
原链表1->3->5
传入(1, new Node(2)) 会变成  1->3->5->2
****************************************
    public void add(Node head, Node add) {
        if (head == null)
            return;
        while(head.next != null) {
            head = head.next;
        }
        head.next = add;
    }

顺序就是用while输出value就行,逆序就是写个递归倒着输出value就行
重点说一下我做反转链表的思路
所有思路都在图片里面了。
PS:这应该是我最后一次主动在网上画图,太费劲儿了,以后还是手画。


图片是我自己画的1
图片是我自己画的2
上一篇 下一篇

猜你喜欢

热点阅读