美文网首页Android 提高篇
Java链表实现以及链表倒置

Java链表实现以及链表倒置

作者: xx1994 | 来源:发表于2017-03-02 15:52 被阅读0次

链表一种在物理存储单元上非连续、非顺序的一种存储结构,元素通过链表中的指针链接次序实现。链表是由节点组成,每一个节点包括两部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。相比于线性表,操作变得复杂,但是对于数据的删除和增加要快。

链表结构图.png

Java代码实现链表

public class MyList {

    private Node head; // 定义一个头节点
    private Node current; // 记录当前节点

    public static void main(String[] args) {
        MyList myList = new MyList();
        for (int i = 0; i < 5; i++) {
            myList.addData(i); // 循环添加5个元素
        }

        myList.printList(myList.head);   //打印链表
    }

    // 往链表中添加数据
    private void addData(int data) {
        if (head == null) {
            head = new Node(data); // 如果头节点为空,就新建一个头结点
            current = head; // 记录当前节点为头结点
        } else {
            current.next = new Node(data); // 新建一个节点,当前节点的指针域指向它
            current = current.next; // 当前节点位置后移
        }
    }

    // 打印链表
    private void printList(Node head) {
        if (head != null) { // 确定链表不为空
            current = head;
            while (current!= null) { // 最后一个节点的为空
                System.out.print(current.data + "-->");
                current = current.next; // 当前节点往后移动一个位置
            }
        }
    }

    // 自定义节点类,包含数据域和指针域
    class Node {
        int data; // 数据域
        Node next; // 指针域

        public Node(int data) {
            this.data = data;
        }
    }
}

链表倒置问题
一些公司经常拿来做为笔试题,至少在我刚出来实习时前几次面试中就碰到过两次。所以还是有必要进行细心准备一下。以下在上面实现的链表基础上进行倒置。

  • 递归倒置法

在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向

    // 递归倒置链表
    private Node resetList1(Node head) {
        if (head == null || head.next == null) {   
            return head;                        // 若为空链或者当前结点在尾结点,则直接返回
        } else {
            Node newHead = resetList1(head.next);   //反转后续节点head.next
            head.next.next = head;              //将当前节点的指针域向前移
            head.next = null;                   //前一节点的指针域置空
            return newHead;
        }
    }
  • 遍历反转法

从前往后,通过生成一个临时节点next进行下一节点缓存,指针反转后,再将缓存节点赋值给当前节点,这样往后移动

    // 遍历方法倒置
    private Node resetList2(Node head) {
        Node current = head;
        Node next = null;
        Node newHead = null;
        if (head == null || head.next == null) {
            return head;
        } else {
            while (current != null) {    //为空时到了尾节点
                next = current.next;     //新结点next缓存下一个节点
                current.next = newHead;  //指针域反转
                newHead = current;       //将当前节点给newHead
                current = next;          //移动到下一个节点
            }
        }
        return newHead;
    }

相关文章

  • Java链表实现以及链表倒置

    链表一种在物理存储单元上非连续、非顺序的一种存储结构,元素通过链表中的指针链接次序实现。链表是由节点组成,每一个节...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 15反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头。 Java实现

  • 数据结构 | 其二 链表

    冰河winner - 数据结构之链表 2.1 单向链表 数据结构(一) 单链表的实现-JAVA 2.2 双端链表 ...

  • 单向链表反转(含图解)

    前言 上次讲解了单向链表的原理《Java实现单向链表功能》,今天拓展一下实现链表的翻转。下面直接上代码。 链表初始...

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • 基于动态数组的实现 Java实现 基于链表的栈的实现 Java实现

  • 倒置链表

    题目描述:给出单向链表的头节点l,如何只遍历一次就将链表中的所有元素倒转。 算法描述: 首先给出单向链表的结构 遍...

  • 链表面试题Java实现【重要】

    链表面试题Java实现【重要】

网友评论

    本文标题:Java链表实现以及链表倒置

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