美文网首页
单链表实现链表逆序(详细思路)

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

作者: 云鲸鱼rain | 来源:发表于2019-03-14 17:04 被阅读0次

这道题,是我毕业前在北京找实习真实碰到的一个面试题。
逆序谁不会是吧,啥?不能用数组,不能用字符串,集合。只能用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

相关文章

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

    这道题,是我毕业前在北京找实习真实碰到的一个面试题。逆序谁不会是吧,啥?不能用数组,不能用字符串,集合。只能用no...

  • Leetcode-Medium-2 Add Two Number

    题目 思路 给定两哥数字非负的单链表,每条单链表逆序存储着一个数字。将两条单链表存储的数字相加,并逆序放入单链表中...

  • leetcode 单链表的各种算法

    1 递归实现:合并两个有序的单链表 2 递归实现:单链表逆序存入vector 3 循环实现:快慢指针找到单链表中间...

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 逆序打印单链表

    题目描述: 逆序打印单链表,要求不能改变链表结构。 思路分析: 由于单链表只能顺序遍历(从头到尾遍历)而不能逆向遍...

  • 单链表逆置

    单链表逆置的思路 a:将单链表储存为数组,然后按照数组的索引逆序进行反转。b:使用3个指针遍历单链表,逐个链接点进...

  • LeetCode 2. Add Two Numbers

    单链表逆序相加

  • 2.单链表

    该部分包含以下内容-单链表的增删改查-计算链表长度-逆序链表-寻找(删除)链表倒数第K个元素-逆序打印链表(使用栈)

  • 单链表 常用操作(golang)

    (单链表备忘记录)知识点: 单链表结构 创建链表方法头插法创建尾插法创建 遍历链表 逆序反转链表迭代递归头插法就地...

  • 双向链表

    1、双向链表 单链表只能从头结点first开始访问链表中的数据元素,如果需要逆序访问单链表中的数据元素将极其低效。...

网友评论

      本文标题:单链表实现链表逆序(详细思路)

      本文链接:https://www.haomeiwen.com/subject/mciqmqtx.html