Java链表数据结构及使用方法实例分析

发布时间:2022-07-05 13:53:28 作者:iii
来源:亿速云 阅读:128

本篇内容主要讲解“Java链表数据结构及使用方法实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java链表数据结构及使用方法实例分析”吧!

认识链表结构

单向链表

单链表在内存中的表示:

Java链表数据结构及使用方法实例分析

可以看到,一个链表的节点包含数据域和指向下一个节点的引用,链表最后一个节点指向null(空区域)。

我们可以根据这一定义,用Java语言表示一下单向链表的结构:

public class Node {
    public int value;
    public Node next;
    
    public Node(int value) {
        this.value = value;
    }
}

在链表的结构中,有数据域value,以及一个指向下一个节点的引用next。

TIP:这里的value还可以定义成泛型的。

双向链表

我们再来看一下双向链表的结构:

Java链表数据结构及使用方法实例分析

双向链表中的节点有数值域,和指向它前一个节点的引用以及指向它后一个节点的引用,据此我们可以定义出

双向链表的结构:

public class DoubleNode {
    public int value;
    public DoubleNode pre;
    public DoubleNode next;
    
    public DoubleNode(int value) {
        this.value = value;
    }
}

加深对链表结构的理解

实现单向和双向链表的反转

说明:

对于一个链表如图所示:

Java链表数据结构及使用方法实例分析

反转的意思是,将原来链表上的节点指针指向反转,原来的指向是:a -> b -> c -> d -> null,变成现在的指向:d -> c -> b -> a -> null,

即反转后的结构如图所示:

Java链表数据结构及使用方法实例分析

这个题目不难,我们转换一下指针的指向就行了。

设计这样一个函数,函数的过程是调整链表各节点的指针指向,那么这个函数的要素有:

解题技巧:定义两个Node引用辅助我们反转指针指向。

代码实现:

public static Node reverseNode(Node head) {
    Node pre = null;
    Node next = null;
    //最终让head指向null
    while (head != null) {
        next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

我们来模拟一下这个函数的执行过程。

链表原始状态:

Java链表数据结构及使用方法实例分析

方法开始执行,此时 head.next 不为空,所以,执行如下步骤:

next = head.next:让next指向head(当前节点)的下一个节点,即b

Java链表数据结构及使用方法实例分析

head.next = pre:让当前节点的下一个节点指向pre,即null

Java链表数据结构及使用方法实例分析

此时当前节点从原来指向b,改为指向null。

Java链表数据结构及使用方法实例分析

第一次循环执行结束,此时 head 为b,不是null,所以继续循环,执行流程:

Java链表数据结构及使用方法实例分析

此时 head 为c,不是null,所以继续循环,执行流程如下:

Java链表数据结构及使用方法实例分析

同理,此时 head 为d,不是null,继续循环:

Java链表数据结构及使用方法实例分析

这是就完成了单链表的反转步骤。

有了单链表反转的经验,我们很容易就能实现双向链表的反转,代码如下:

public DoubleNode reverseDoubleNode(DoubleNode head) {
    DoubleNode pre = null;
    DoubleNode next = null;
    while (head != null) {
        next = head.next;
        //操作(移动)当前节点
        head.next = pre;
        head.pre = next;

        pre = head;
        head = next;
    }
    return pre;
}

实现把链表中给定的值都删除

题如:给定一个单链表头节点head,以及一个整数,要求把链表中值为给定整数的节点都删除。

Java链表数据结构及使用方法实例分析

实现思路:

//head移动到第一个不需要删除的位置:边界条件
while (head != null) {
    if (head.value != num) {
        break;
    }
    //head右移
    head = head.next;
}
//跳出循环之后,head的情况:
//1. head = null,这种情况是链表中的值全部是给定值,全删了
//2. head != null
// 中间操作
//最终返回head:第一个不是给定值的节点
return head;

head移动到第一个不需要删除的位置后,head若为null,表示所有节点都删除了,直接返回就可以了;若head不为null,借助两个辅助变量Node pre和cur,从head处开始往next走,遇到给定值就跳过。

Node pre = head;
Node cur = head;
while (cur != null) {
    if (cur.value == num) {
        pre.next = cur.next;
    } else {
        pre = cur;
    }
    cur = cur.next;
}

这一执行过程图解如下:

Java链表数据结构及使用方法实例分析

通过上述分析,写出完整实现代码:

public static Node remove (Node head, int num) {
    while (head != null) {
        if (head.value != num) {
            break;
        }
        head = head.next;
    }

    Node pre = head;
    Node cur = head;

    while (cur != null) {
        if (cur.value == num) {
            pre.next = cur.next;
        } else {
            pre = cur;
        }
        cur = cur.next;
    }
    return head;
}

到此,相信大家对“Java链表数据结构及使用方法实例分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 数据结构——链表
  2. 数据结构-链表-0

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java中Elasticsearch实现分页的方法有哪些

下一篇:Python中def()函数怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》