`

数据结构学习笔记之一:链表

阅读更多

许多人都知道链表(C语言)都是借助指针来实现链接的,同样许多人也知道java语言是没有指针的,所以很多人可能很理所当然的认为"java没有数据结构",我想这种想法是错误的.程序=算法+数据结构,任何语言都离不开数据结构(唉,这么简单一个道理我也是最近才悟出的,惭愧啊...).下面我就谈谈java语言的数据结构.

代码一:链表结构的java实现

    package listtest;

    public class ListNode {
           
            Object element;
            ListNode next;
                   
            ListNode(Object o,ListNode n)
            {
                    element=o;
                    next=n;
            }
           
            ListNode(Object o)
            {
                    this(o,null);
            }
    }

代码二:链表操作器的java实现


    package listtest;

    public class LinkedList {

            private ListNode header;
           
            LinkedList()
            {
                    header=new ListNode(null);
            }
           
            LinkedList(ListNode n)
            {
                    header=new ListNode(null,n);
            }
           
            /**
             * 判断链表是否为空
             * @return 链表是否为空的布尔值
             */
            boolean isEmpty()
            {
                    return header.next==null;
            }
           
            /**
             * 清空链表.
             * 注:此方法没有真正清除内存,清楚内存的任务交给java垃圾回收器去处理吧.^_^
             */
            void makeEmpty()
            {
                    header=null;
                    System.gc();
            }
           
            /**
             * 查找目标数据所在节点
             * @param o 目标数据
             * @return 保存目标数据节点
             */
            ListNode find(Object o)
            {
                    if(isEmpty())
                            return null;
                   
                    ListNode node = header.next;
                    while(node!=null)
                    {
                            if(node.element.equals(o))
                                    return node;
                           
                            node=node.next;
                    }
                    return null;
            }
           
            /**
             * 在节点node后面新建一个节点,该节点保存数据o
             * @param o 数据
             * @param node 插入节点
             */
            void insert(Object o,ListNode node)
            {
                    node.next=new ListNode(o,node.next);
            }
           
            /**
             * 删除目标数据的节点
             * @param o 目标数据
             */
            void remove(Object o)
            {
                    if(isEmpty())
                            return;
                   
                    ListNode node = header.next;
                    while(node!=null)
                    {
                            if(node.next.element.equals(o))
                            {
                                    node.next=node.next.next;
                                    return;
                            }
                            node = node.next;
                    }
            }
    }

完成...参考了<数据结构(C语言版)>(hjack借我D书,呵呵,沾点仙气)和<数据结构与算法分析--java语言描述>,不过感觉原作者写得罗嗦了点,所以自己整理了下(原著的java实现用了3个类,我觉得有点不必要).

接下来用链表解一道题.这道题是我去北电笔试的时候遇到的,当时做得乱七八糟(因为要求用C/C++做...晕...当时就投降了...).

题目是这样的:输入一串字符,分别统计各个字符的数目.(maybe大家都觉得很简单,,,但我当时确实不会...用力鄙视我吧...)

这题用了三个文件,其中两个分别是链表结构和链表操作器.

文件一:ListNode.java

    package list;


    public class ListNode {
           
            char element;        //当前字符
            int count;                //字符个数

            ListNode next;
           
            ListNode(char c,ListNode n)
            {
                    element = c;
                    count=1;
                    next=n;
            }
           
            ListNode(char c)
            {
                    this(c,null);
            }
    }

文件二:LinkedList.java

    package list;

    public class LinkedList {

            ListNode header;
           
            LinkedList()
            {
                    this(null);
            }
           
            LinkedList(ListNode n)
            {
                    header=new ListNode(' ',n);
            }
           
            boolean isEmpty()
            {
                    return header.next==null;
            }
           
            void makeEmpty()
            {
                    header=null;
            }
           
            ListNode find(char c)
            {
                    if(isEmpty())
                            return null;
                   
                    ListNode node = header.next;
                    while(node!=null)
                    {
                            if(node.element==c)
                                    return node;
                           
                            node=node.next;
                    }
                    return null;
            }
           
            void insert(char c,ListNode node)
            {
                    node.next=new ListNode(c,node.next);
            }
           
            void remove(char c)
            {
                    if(isEmpty())
                            return;
                   
                    ListNode node = header.next;
                    while(node!=null)
                    {
                            if(node.next.element==c)
                            {
                                    node.next=node.next.next;
                                    return;
                            }
                            node = node.next;
                    }
            }
    }

文件三:Test.java

    package list;

    public class Test {
           
            public static void showCharCount(char s[])
            {
                    System.out.println("原字符串是:"+new String(s));
                    LinkedList list = new LinkedList();
                    ListNode node;
                    for(int i=0;i<s.length;i++)
                    {
                            if((node=list.find(s[i]))==null)
                                    list.insert(s[i],list.header);
                            else
                                    node.count++;                               
                    }
                   
                    /*
                     * 打印链表
                     */
                    node = list.header.next;
                    while(node!=null&&!list.isEmpty())
                    {
                            System.out.println("字符:  '"
                                            +node.element+"'    出现:  "
                                            +node.count+"  次");
                            node=node.next;
                    }
            }
           
            public static void showCharCount(String s)
            {
                    showCharCount(s.toCharArray());
            }

            public static void main(String[] args) {

                    showCharCount("abcd ssd wool");

            }
    }

最后修饰下,把main方法写漂亮点:

            public static void main(String[] args) throws IOException{

                    String s;
                    while(true)
                    {
                            System.out.print("请输入待统计字符串:  ");
                            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                            s = br.readLine();
                           
                            if(s.length()>=40)
                            {
                                    System.out.println("请输入40个字符以内.");
                                    System.out.println("===============================\n");
                                    continue;
                            }
                            else
                                    break;                       
                    }
                    showCharCount(s);

            }


效果如下:

请输入待统计字符串:  Woden!Never give up!!!I'll do my best!!!
请输入40个字符以内.
===============================

请输入待统计字符串:  Woden!Never give up!!!
原字符串是:Woden!Never give up!!!
字符:  'p'    出现:  1  次
字符:  'u'    出现:  1  次
字符:  'i'    出现:  1  次
字符:  'g'    出现:  1  次
字符:  ' '    出现:  2  次
字符:  'r'    出现:  1  次
字符:  'v'    出现:  2  次
字符:  'N'    出现:  1  次
字符:  '!'    出现:  4  次
字符:  'n'    出现:  1  次
字符:  'e'    出现:  4  次
字符:  'd'    出现:  1  次
字符:  'o'    出现:  1  次
字符:  'W'    出现:  1  次
分享到:
评论

相关推荐

    Java数据结构学习笔记

    ### Java数据结构学习笔记知识点详解 #### 一、数据结构与算法基础 1. **数据结构定义** - 数据结构是一门研究组织数据方式的学科,它与编程语言紧密相关,是实现高效程序设计的基础。 - 在软件开发中,合理选择...

    数据结构学习笔记.zip

    数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...

    数据结构学习笔记

    数据结构是计算机科学的基础之一,它不仅涉及到如何存储和组织数据,还涉及到如何高效地处理这些数据。通过理解不同的数据结构和它们的特点,我们可以选择最适合特定问题的解决方案。无论是链表、哈希表、二叉树还是...

    数据结构高分笔记part1

    2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...

    uC/OS-II学习笔记—空闲链表和就绪链表

    uC/OS-II学习笔记—空闲链表和就绪链表 uC/OS-II是实时操作系统,任务控制块是uC/OS-II中最基本的数据结构,它负责管理任务的状态和信息。uC/OS-II将任务控制块分成两个链表来管理,这就是空闲链表和就绪链表。空闲...

    数据结构笔记之线性表(-):静态链表表示与实现

    在计算机科学领域,数据结构是组织和管理大量数据的关键技术之一。线性表是一种基本的数据结构,它由有限个相同类型元素构成的有序序列。在这个主题中,我们将深入探讨线性表的一种特殊实现——静态链表,以及如何...

    算法与数据结构学习笔记

    这本"算法与数据结构学习笔记"涵盖了这两个核心概念的详细讲解,对于任何想要深入理解计算机科学原理、提高编程技能的人来说,都是一份宝贵的资源。 算法,简单来说,就是解决特定问题的步骤或指令集。它在计算机...

    java数据结构和算法学习笔记

    ### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...

    数据结构学习笔记-链表中的双向链表(JAVA)

    在数据结构的学习中,链表是一种非常基础且重要的概念,特别是在Java编程中。本文将深入探讨标题中的主题——“双向链表”。双向链表是一种特殊形式的链表,每个节点不仅包含指向下一个节点的指针,还包含一个指向前...

    数据结构和算法学习笔记(经典)

    这份“数据结构和算法学习笔记(经典)”的PDF文档很可能包含了丰富的理论与实践内容,旨在帮助读者掌握这些关键概念。 1. **数据结构**:数据结构是指在计算机中组织和存储数据的方式,它决定了数据的操作效率和...

    数据结构学习笔记.doc

    数据结构学习笔记 数据结构是一种组织和存储数据的方式,它包括数据的逻辑结构、存储...数据结构学习笔记提供了一个系统的数据结构知识框架,对于学习数据结构的学生和从事计算机科学和信息技术的专业人员非常有用。

    严蔚敏-数据结构视频学习笔记

    这里提到的《严蔚敏-数据结构视频学习笔记》就是基于严蔚敏教授的视频教程整理而成的学习笔记,这个笔记的特点是内容全面详细,可以帮助学习者在不观看视频的情况下直接学习这门课程。 数据结构的核心内容大致可以...

    学习笔记之用:C++、数据结构与算法、计算机网络、操作系统、Linux、Git、MySQL等;.zip

    在本压缩包中,"学习笔记之用:C++、数据结构与算法、计算机网络、操作系统、Linux、Git、MySQL等",包含了多个IT领域的核心主题。这些主题都是计算机科学和技术的基础,对于任何想要深入理解计算机工作原理或者从事...

    2020 天勤数据结构 高分笔记 + 习题

    总之,这份资料为准备考研的同学提供了一个全面的数据结构学习资源,通过笔记和习题的结合,有助于考生在考试中取得优异成绩。在复习过程中,考生应注重理论与实践的结合,不断思考和练习,才能真正掌握数据结构的...

    c语言数据结构学习笔记.pdf

    C语言数据结构学习笔记的核心内容可以分为以下几个方面: 1. 数据结构基础 数据结构是计算机存储、组织数据的方式。它包括数据的逻辑结构、物理结构(存储结构)以及数据的运算。 1.1 逻辑结构和物理结构 逻辑结构...

    数据结构电子笔记

    这份“数据结构电子笔记”涵盖了这一领域的重要概念和算法,是学习和理解数据结构的理想资源。 笔记可能包含了以下关键知识点: 1. **线性数据结构**:包括数组、链表(单链表、双链表、循环链表)、栈和队列。...

    《Java数据结构和算法》学习笔记(4)——链表

    在编程领域,数据结构和算法是核心技术之一,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,对数据结构和算法的支持尤为关键。本文将深入探讨链表这一重要的线性数据结构,并通过源码分析来理解其...

    数据结构高分笔记

    ### 数据结构高分笔记知识点详解 #### 一、引言 ...通过上述分析,《数据结构高分笔记》不仅是一本详尽的数据结构学习指南,也是帮助考生高效备考的宝贵资源。希望每位读者都能从中受益,顺利通过考试。

    数据结构(C语言描述)学习笔记.zip

    数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...

Global site tag (gtag.js) - Google Analytics