`
FlyingFairy
  • 浏览: 12685 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

致我曾经敲过的代码——初涉JAVA 自定义链表的实现

阅读更多

1.链表结构是什么样的?

链表自然就是链式的结构

 

2.链表的组成

链表是由头节点,中间节点和尾节点组成

节点是由两个部分组成:

1.数据域-- 如果有多个数据,存储为一个

2.引用域-- 单链表就只有一个引用双链表两个引用

 

3.链表的实现

Node{

数据域

引用域

}

MyLinkedList{

记录元素总数的属性

头节点属性

Noderoot;

尾节点属性

Nodetrail;

 

添加元素的方法

移除元素的方法

插入元素的方法

修改元素的方法

获取元素的方法

获取元素总数的方法

}

 

具体的实现

 

//节点的类
package Link;

public class Node2<E> {

	private Object obj;// 节点内的数据对象

	private Node2<E> parent;// 对父节点的引用
	private Node2<E> kid;// 对子节点的引用

	// 在创建节点对象的时候 就传入节点中的数据对象
	public Node2(Object obj) {
		this.obj = obj;
	}

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}

	public Node2<E> getParent() {
		return parent;
	}

	public void setParent(Node2<E> parent) {
		this.parent = parent;
	}

	public Node2<E> getKid() {
		return kid;
	}

	public void setKid(Node2<E> kid) {
		this.kid = kid;
	}

}
//MyLinkedList链表类

package Link;

import java.util.ArrayList;

public class MyLinkedList2<E> {

	private int size;
	private Node2<E> root;// 头节点
	private Node2<E> trail;// 尾节点

	/**
	 * 添加元素的方法
	 * 
	 * @param e要添加的新元素对象
	 */
	public void add(E e) {
		// 创建Node对象
		Node2<E> node = new Node2<E>(e);

		// 如果是第一次添加节点
		if (root == null) {
			root = node;
			trail = node;
		} else {// 表示不是第一次添加节点
				// 将新节点做为尾节点
			trail.setKid(node);
			trail = node;
		}

		size++;// 记录元素总数属性增加1
	}

	/**
	 * 移除指定索引位置元素的方法
	 * 
	 * @param index索引位置
	 * @return 返回移除后的数据
	 */
	public E remove(int index) {
		// 判断index是否在范围之内
		if (index < 0 || index >= size)
			return null;
		if (index == 0) {
			E e = (E) root.getObj();
			root = root.getKid();
			size--;
			return e;
		}
		Node2<E> t_node = root;
		// 找index的上一个节点
		for (int i = 0; i < index - 2; i++) {
			t_node = t_node.getKid();
		}
		Node2<E> r_node = t_node.getKid();
		Node2<E> r_n_node = r_node.getKid();

		// 构建关系
		t_node.setKid(r_n_node);

		// 记录元素的总数属性减少1
		size--;

		return (E) r_node.getObj();
	}

	/**
	 * 获取指定索引位置元素的方法
	 * 
	 * @param index索引位置
	 * @return 返回index对应的元素
	 */
	public E get(int index) {
		// 判断index是否在范围之内
		if (index < 0 || index >= size)
			return null;
		Node2<E> t_node = root;
		// 找index位置节点
		for (int i = 0; i < index - 1; i++) {
			t_node = t_node.getKid();
		}
		return (E) t_node.getObj();
	}

	/**
	 * 根据索引删除节点
	 * 
	 * @param index
	 *            :索引
	 */
	public void delete(int index2) {
		// if (index < 0 || index >= size)
		int index = index2 - 1;
		if (this.getLength() < index || index < 0) {
			throw new java.lang.RuntimeException("下标越界" + index + ",size:"
					+ this.getLength());
		} else {
			Node2<E> node = this.getNode(index);
			Node2<E> parent = node.getParent();
			Node2<E> kid = node.getKid();
			if (parent == null) {
				root = kid;
			} else if (kid == null) {
				parent.setKid(null);
			} else {
				parent.setKid(kid);
				kid.setParent(parent);
			}
		}
		size -= index;
	}

	/**
	 * 获取链表的长度
	 * 
	 * @return 链表
	 */
	public int getLength() {
		int count = 0;
		if (root == null) {
			return count;
		}
		Node2<E> node = root.getKid();
		while (null != node) {
			count++;
			node = node.getKid();
		}
		return count + 1;
	}

	/**
	 * 插入一个新数据
	 * 
	 * @param index2
	 *            对象的索引
	 * @param obj
	 *            插入的元素
	 */
	public void insert(int index2, Object obj) {
		int index = index2 - 1;
		if (this.getLength() < index || index < 0) {
			throw new java.lang.RuntimeException("下标越界" + index + ",size:"
					+ this.getLength());
		} else {
			Node2<E> newNode = new Node2<E>(obj);
			Node2<E> node = this.getNode(index2);
			if (index == 0)
				root = newNode;
			else {
				Node2<E> fNode = node.getParent();
				fNode.setKid(newNode);
				newNode.setParent(fNode);
			}
			newNode.setKid(node);
			node.setParent(newNode);
		}
	}

	/**
	 * 修改对象节点
	 * 
	 * @param index
	 *            :对象节点的索引
	 * @param obj
	 *            :修改对象的内容
	 */
	public void update(int index2, Object obj) {
		int index = index2 - 1;
		if (this.getLength() < index || index < 0) {
			throw new java.lang.RuntimeException("下标越界" + index + ",size:"
					+ this.getLength());
		} else {
			Node2<E> node = this.getNode(index);
			node.setObj(obj);
			Node2<E> parent = node.getParent();
			Node2<E> kid = node.getKid();
		}
	}

	/**
	 * 根据索引取出节点
	 * 
	 * @param index
	 *            :索引
	 * @return 返回的节点
	 */
	public Node2<E> getNode(int index) {
		if (this.getLength() < index || index < 0) {
			throw new java.lang.RuntimeException("下标越界" + index + ",size:"
					+ this.getLength());
		} else {
			int num = 0;
			Node2<E> node = root;
			while (num != index) {
				node = node.getKid();
				num++;
			}
			return node;
		}
	}

	/**
	 * 遍历链表
	 * 
	 * @param root
	 *            :链表的根据点
	 */
	public void print(Node2<E> root) {
		if (null != root) {
			Object data = root.getObj();
			System.out.print(data + "  ");
			Node2<E> tmp = root.getKid();
			print(tmp);
		}
	}

	/**
	 * 获取链表元素的总数的方法
	 * 
	 * @return 返回size属性
	 */
	public int size() {
		return size;
	}
}
//测试的主类
package Link;

import java.util.Random;

/**
 * 差不多就是测试的东西吧
 * 
 * @author Natsu
 * 
 */
public class Manager2 {
	public static Node2<String> front = null;
	public Node2<String> last = null;

	public static void main(String[] args) {
		MyLinkedList2<String> mll = new MyLinkedList2<String>();

		Random rand = new Random();

		for (int i = 0; i < 10; i++) {
			char c = (char) (rand.nextInt(26) + 97);
			mll.add(c + "");
		}

		// for (int i = 0; i < mll.size(); i++) {
		// 遍历链表的方法
		mll.print(mll.getNode(0));
		// }
		System.out.println();
		mll.print(mll.getNode(0));
		System.out.println();
		System.out.println("++++++++++++++++++++++++++++++++");
		mll.delete(3);
		// 遍历链表的方法
		mll.print(mll.getNode(0));
		System.out.println();
		System.out.println("++++++++++++++++++++++++++++++++");
		// 移除第五位
		mll.remove(4);
		mll.print(mll.getNode(0));
		System.out.println();
		System.out.println("++++++++++++++++++++++++++++++++");
		mll.update(3, "e");
		mll.print(mll.getNode(0));
		System.out.println();
		System.out.println("++++++++++++++++++++++++++++++++");
		mll.insert(3, "r");
		mll.print(mll.getNode(0));
	}

}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

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

    在Java中,我们可以自定义类来实现链表,或者使用内置的`java.util.LinkedList`类。本文将以单链表为例,讲解其核心概念和操作。 1. 单链表的创建与插入: 创建链表需要先创建一个头节点,然后通过插入操作逐步...

    数据结构 单链表 java图形界面实现

    在本项目中,我们主要探讨的是数据结构中的一个重要概念——单链表,以及如何使用Java语言结合图形用户界面(GUI)来实现它。单链表是一种线性数据结构,其中的元素不是顺序存储的,而是通过指向下一个元素的指针...

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

    在数据结构的学习中,链表是一种非常基础且重要...在Java中实现双向链表,需要理解其基本结构和操作方法,并能编写相应的代码来创建、修改和遍历链表。对于IT专业人士来说,熟练掌握双向链表是提升编程技能的重要步骤。

    JAVA贪吃蛇游戏毕业设计(源代码+论文).zip

    这个项目不仅包含了游戏的完整源代码,还有一篇详细阐述设计思路和实现过程的毕业论文,对于学习Java编程和游戏开发的学生来说,是极具参考价值的资源。 【描述】:在JAVA贪吃蛇游戏毕业设计中,开发者可能采用了...

    java-leetcode题解之第147题对链表进行插入排序.zip

    在本压缩包中,我们关注的是一个Java编程相关的学习资源,特别是一道来自LeetCode的题目——第147题“对链表进行插入排序”。LeetCode是一个知名的在线编程挑战平台,它提供了一系列的算法问题,帮助开发者提升编程...

    经典算法问题的java实现<二>

    在第二部分中,我们将聚焦于一个具体的典型代码示例——`TypicalCode1.java`。 【描述】: 虽然描述为空,但我们可以推断这是一个关于Java实现算法的系列文章的第二部分。通常这类文章会涵盖不同的算法类型,如...

    数据结构与算法分析——Java语言描述

    总的来说,"数据结构与算法分析——Java语言描述"这一主题涵盖了计算机科学基础中的关键内容,包括数据结构的选取、算法的设计与分析,以及如何在实际编程中运用Java语言来实现这些概念。通过深入学习,我们可以提升...

    2011.08.30(2)——— java BlockingQueue ExecutorService

    标题 "2011.08.30(2)——— java BlockingQueue ExecutorService" 涉及到Java并发编程中的两个核心组件:BlockingQueue(阻塞队列)和ExecutorService。这篇博客可能深入探讨了如何使用这两个工具来优化多线程环境...

    JAVA经典例题——超赞版

    1. **数据结构与算法**:例如,实现各种数据结构(如数组、链表、栈、队列、树、图)和算法(如排序、搜索)的JAVA代码。 2. **异常处理**:学习如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的...

    java面试——深圳-中国平安-Java中级.zip

    下面将根据"java面试——深圳-中国平安-Java中级.pdf"这份资料,提炼出一些核心的Java知识点。 1. **Java基础**: - **数据类型**:包括基本数据类型和引用数据类型,理解它们的区别和内存管理。 - **类与对象**...

    贪吃蛇——android源代码

    【贪吃蛇——Android源代码】是一个非常适合初学者的项目,它可以帮助你深入了解Android应用程序开发的基本原理和实践。在这个项目中,你可以学习到如何利用Java语言和Android SDK创建一个简单的游戏应用。 首先,...

    数据结构算法与应用 C++和Java语言描述 含代码 Sahni 一二版中英合集

    本书"数据结构算法与应用 C++和Java语言描述 含代码 Sahni 一二版中英合集"深入探讨了这些核心概念,提供了两种广泛使用的编程语言——C++和Java的实现。作者Sahni以其清晰的解释和丰富的实例,帮助读者深入理解数据...

    JAVA学习——集合与三层设计模式

    LinkedList则是通过链表结构实现,插入和删除操作速度快,但随机访问速度慢。 2. **Set**:Set不允许有重复元素,常见的实现有HashSet,它不保证元素顺序,基于哈希表实现;TreeSet则按照元素的自然排序或自定义...

    疯狂Java讲义源码(第六部分)

    《疯狂Java讲义》是Java编程领域的一本经典教材,其源码分为多个部分,这里主要探讨的是第六部分,涵盖了第11至13章的内容。这三章涉及了Java高级特性和面向对象编程的深入理解,对于进阶Java开发者来说至关重要。...

    JAVA类集应用

    首先,我们要理解Java类集框架的基础——接口。主要有`List`、`Set`、`Queue`和`Map`这四大接口,它们各自代表了一种特定的数据组织方式。`List`接口存储有序的元素,允许重复;`Set`接口存储不重复的元素,无序;`...

    《Java数据结构和算法》学习笔记(3)——栈和队列

    Java提供了java.util.Queue接口,常见的实现有LinkedList(链表实现)和ArrayDeque(数组双端队列)等。enqueue()或add()用于入队,dequeue()或remove()用于出队,peek()用于查看队首元素但不移除。 除了基本操作,...

    Java实战入门[一个资深Java培训老师倾力收藏].pdf

    第十六章“数据结构之链表”深入讲解了链表的原理和实现,包括单向链表、双向链表以及自定义队列的实现。 第十七章“哈夫曼压缩的实现”涉及了数据压缩的原理,特别是哈夫曼编码算法的实现过程,这对于理解数据压缩...

    BombMan——实时联机对战小游戏 一个用java swing写的实时联机对战小游戏.zip

    《BombMan——实时联机对战小游戏》是基于Java Swing技术开发的一款小型的多人在线对战游戏。在这款游戏中,玩家可以与朋友们实时互动,体验炸弹人风格的竞技乐趣。Swing是Java的一个图形用户界面(GUI)工具包,用于...

    JAVA-SE入门学习——第八讲集合

    ng[] args) { // 使用增强for循环遍历ArrayList ArrayList&lt;String&gt; list = new ArrayList(); list.add("apple"); list.add("banana");...在实际开发中,掌握这些知识对于编写高效、安全的Java代码至关重要。

    基于java+J2ME的手机贪吃蛇游戏开发项目设计与实现(项目报告+源代码).zip

    本项目旨在利用Java J2ME技术,设计并实现一款经典的手机游戏——贪吃蛇。下面我们将详细探讨这个项目的设计思路、关键技术以及实现过程。 一、项目背景与目标 在Java J2ME平台上开发游戏,主要考虑的是设备的性能...

Global site tag (gtag.js) - Google Analytics