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

阅读更多

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

链表自然就是链式的结构

 

2.链表的组成

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

节点是由两个部分组成:

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

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

 

3.链表的实现

Node{

数据域

引用域

}

MyLinkedList{

记录元素总数的属性

头节点属性

Noderoot;

尾节点属性

Nodetrail;

 

添加元素的方法

移除元素的方法

插入元素的方法

修改元素的方法

获取元素的方法

获取元素总数的方法

}

 

具体的实现

 

//节点的类
package Link;

public class Node2 {

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

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

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

	public Object getObj() {
		return obj;
	}

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

	public Node2 getParent() {
		return parent;
	}

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

	public Node2 getKid() {
		return kid;
	}

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

}
//MyLinkedList链表类

package Link;

import java.util.ArrayList;

public class MyLinkedList2 {

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

	/**
	 * 添加元素的方法
	 * 
	 * @param e要添加的新元素对象
	 */
	public void add(E e) {
		// 创建Node对象
		Node2 node = new Node2(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 t_node = root;
		// 找index的上一个节点
		for (int i = 0; i < index - 2; i++) {
			t_node = t_node.getKid();
		}
		Node2 r_node = t_node.getKid();
		Node2 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 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 node = this.getNode(index);
			Node2 parent = node.getParent();
			Node2 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 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 newNode = new Node2(obj);
			Node2 node = this.getNode(index2);
			if (index == 0)
				root = newNode;
			else {
				Node2 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 node = this.getNode(index);
			node.setObj(obj);
			Node2 parent = node.getParent();
			Node2 kid = node.getKid();
		}
	}

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

	/**
	 * 遍历链表
	 * 
	 * @param root
	 *            :链表的根据点
	 */
	public void print(Node2 root) {
		if (null != root) {
			Object data = root.getObj();
			System.out.print(data + "  ");
			Node2 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 front = null;
	public Node2 last = null;

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

		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,数据结构)