1. 程式人生 > >Java連結串列的實現

Java連結串列的實現

     傳統的物件陣列一旦宣告則長度不可改變,因此,操作起來較為繁雜。

連結串列從本質上講可以理解為“動態的物件陣列”。連結串列可以實現物件的增加、刪除、查詢等等一系列的操作,可以實現動態擴充。如下為連結串列的實現:

package cn.mldn.java;
// 1、定義要儲存物件的類:
class Phone {// 此類提供要儲存的資料
	private String brand;
	private double price;

	public Phone() {
	}

	public Phone(String brand, double price) {
		this.brand = brand;
		this.price = price;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getBrand() {
		return brand;
	}

	public double getPrice() {
		return price;
	}

	@Override
	public boolean equals(Object obj) {// 物件比較
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Phone other = (Phone) obj;
		if (brand == null) {
			if (other.brand != null)
				return false;
		} else if (!brand.equals(other.brand))
			return false;
		if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "brand = " + this.brand + ", price = " + this.price;
	}
}
//2、定義連結串列的操作標準:
interface ILink {// 定義連結串列操作標準
	public void add(Object obj);// 向連結串列中儲存資料

	public int size();// 取得連結串列的長度

	public Object get(int index);// 根據索引取得對應的資料

	public boolean isEmpty();// 判斷連結串列是否為空

	public boolean contains(Object obj);// 判斷某一物件是否存在

	public void set(int index, Object obj);// 根據索引設定資料

	public void remove(Object obj);// 刪除資料

	public void clean();// 清空連結串列

	public Object[] toArray();// 取得連結串列中的所有資料
}
//3、連結串列的具體實現:
class LinkImpl implements ILink {
	private class Node {// 私有內部類,為外部類服務實現資料的增加等一系列的操作
		private Object data;// 可以儲存任意型別的資料
		private Node next;// 指向下一個節點

		public Node(Object data) {// 資料封裝
			this.data = data;
		}

		public void addNode(Node newNode) {
			if (this.next == null) {
				this.next = newNode;
			} else {
				this.next.addNode(newNode);
			}
		}

		public Object getNode(int index) {
			if (LinkImpl.this.foot++ == index) {
				return this.data;
			} else {
				return this.next.getNode(index);
			}
		}

		public boolean containsNode(Object obj) {// 需要物件比較
			if (this.data.equals(obj)) {
				return true;
			} else {
				if (this.next != null) {
					return this.next.containsNode(obj);
				}
				return false;
			}
		}

		public void setNode(int index, Object obj) {
			if (LinkImpl.this.foot++ == index) {
				this.data = obj;
			} else {
				this.next.setNode(index, obj);
			}
		}

		public void removeNode(Node previous, Object obj) {// 需要物件比較
			if (this.data.equals(obj)) {
				previous.next = this.next;
			} else {
				this.next.removeNode(this, obj);
			}
		}

		public void toArrayNode() {
			LinkImpl.this.retArray[foot++] = this.data;
			if (this.next != null) {
				this.next.toArrayNode();
			}
		}
	}

	// ****************************************************
	private Node root;// 根節點
	private int count;// 統計連結串列中的元素個數
	private int foot;// 連結串列元素的下角標
	private Object[] retArray;// 用於接收返回連結串列中的所有資料

	@Override
	public void add(Object obj) {
		if (obj == null) {// 要儲存的資料為空,則結束呼叫
			return;
		}
		Node newNode = new Node(obj);// 封裝資料為一節點
		if (this.root == null) {
			this.root = newNode;
		} else {
			this.root.addNode(newNode);
		}
		this.count++;// 資料增加成功,count 自增
	}

	@Override
	public int size() {
		return this.count;
	}

	@Override
	public Object get(int index) {
		if (this.isEmpty()) {// 連結串列為空
			return null;
		}
		if (index >= this.count) {
			return null;
		}
		this.foot = 0;// 保證資料是從第一個開始遍歷
		return this.root.getNode(index);
	}

	@Override
	public boolean isEmpty() {
		return this.count == 0 && this.root == null;// 根節點不存在或者連結串列中的元素個數為0,表示連結串列為空連結串列
	}

	@Override
	public boolean contains(Object obj) {
		if (this.isEmpty()) {
			return false;
		}
		return this.root.containsNode(obj);
	}

	@Override
	public void set(int index, Object obj) {
		if (this.isEmpty()) {
			return;
		}
		if (index >= this.count) {
			return;
		}
		this.foot = 0;
		this.root.setNode(index, obj);
	}

	@Override
	public void remove(Object obj) {
		if (!this.contains(obj)) {
			return;
		}
		if (this.root.data.equals(obj)) {
			this.root = this.root.next;
		} else {
			this.root.next.removeNode(this.root, obj);
		}
		this.count--;// 資料刪除成功,count 自減
	}

	@Override
	public void clean() {
		this.count = 0;
		this.root = null;
	}

	@Override
	public Object[] toArray() {
		if (this.isEmpty()) {
			return null;
		}
		this.foot = 0;
		this.retArray = new Object[this.count];
		this.root.toArrayNode();
		return this.retArray;
	}
}
//4、編寫測試資料:
public class TestDemo {
	public static void main(String[] args) {
		ILink all = new LinkImpl();// 通過向上轉型例項化連結串列
		System.out.println(all.size());
		System.out.println(all.isEmpty());
		all.add(new Phone("大米手機", 1999.0));
		all.add(new Phone("白米手機", 999.0));
		all.add(new Phone("黑族手機", 1999.0));
		System.out.println(all.isEmpty());
		System.out.println(all.size());
		System.out.println(all.get(1));
		System.out.println(all.contains(new Phone("黑族手機", 1999.0)));
		all.set(2, new Phone("白族手機", 899.0));
		System.out.println(all.get(2));
		all.remove(new Phone("白米手機", 999.0));
		System.out.println(all.size());
		Object obj[] = all.toArray();
		for (int x = 0; x < obj.length; x++) {
			System.out.println(obj[x]);
		}
	}
}


相關推薦

java 連結串列實現多項式加法!

<p style="color:rgb(85, 85, 85);"> </p>package pers.mao.test.ACM; import java.util.Scanner; class Node { int coef; int ex

Java連結串列實現儲存一個隨機圖

演算法老師佈置的一個小作業,在大哥的點撥下完成了這個實現,也是對Java連結串列的一種熟悉。如有不正確之處還請各位大神指教! 要求:生成一個隨機圖,(原則上是上限50個點,100條邊),用連結串列進行儲存,本次試驗的結果作為下次試驗的素材。 首先,自己是一個小

java 連結串列實現

這裡我分享下自己用Java實現的連結串列 : 首先給出一個連結串列模型: 第一步:  建立空連結串列    第二步:建立頭節點 第三部:建立尾節點 到此為止 一個比較有完整意義的連結串列已經構造出  增加節點 刪除節點: 總結:我們可以看到連結

Java連結串列實現

上一篇實現了佇列,這一篇我們實現棧。 棧是後入先出的資料結構。 連結串列中插入資料有頭插法和尾插法,本篇我們使用頭插法。 不多說直接上程式碼 連結串列的節點定義和上一篇使用的是同一個,可以參考上一篇。 public class StackImpl<T> { p

Java連結串列實現佇列

佇列--先入先出 棧---後入先出 連結串列實現佇列和棧。首先我們需要構建一個連結串列。連結串列有哪幾要素?   1、連結串列本身的value 2、連結串列的next指標,next指標指的還是同樣型別的值。 下邊看程式碼 public class Element&l

java佇列的連結串列實現

原始碼的github地址,可以下載到本地執行 package Interface; /** * 佇列介面 * <p> * 佇列是一種先進先出的線性表 * 只能在表的一端進行插入,另一段進行刪除 * 允許插入的一端叫隊尾,允許刪除的一端叫隊頭() * *

java版資料結構與演算法—連結串列實現佇列

package com.zoujc.QueueLink; /** * 連結串列實現佇列 */ class FirstLastList { private Link first; private Link last; public FirstLastList(){

java版資料結構與演算法—連結串列實現

package com.zoujc; /** * 用連結串列實現棧 */ class MyLinkStack { private Link first; public MyLinkStack(){ first = null; } //判空

java連結串列實現leetcode題

package leetcode; public class AddTwoNumbers { /** * 兩個連結串列相加 * input: (2 -> 4 -> 3) +(5->6->4) * output: 7->0->8

java揹包的陣列實現連結串列實現

陣列實現 package base.structure; import java.lang.reflect.Array; import java.util.Iterator; /** * @program: Algorithm4J * @description: 揹包陣列的實現

無序連結串列實現順序查詢(Java實現

連結串列中的每個結點儲存一個鍵值對,get()的實現即為遍歷連結串列,equals()方法比較需要被查詢的鍵和每個結點中的鍵,如果匹配成功就返回相應的值,否則返回null。put()的實現也是遍歷連結串

Java實現---連結串列實現

 用連結串列實現棧: 其實就只是換了個名字,包裝起來而已,沒什麼新的東西。 注:這裡插入結點的方法應為在頭部插入結點(與輸入的值逆置),這樣構成的才是棧 /** * 用連結串列實現棧 * @author Administrator * */ public c

Java原始碼】基於連結串列實現的LinkedList

    眾所周知,LinkedList是基於連結串列實現的。 目錄 基本屬性 構造方法 刪除元素 其他方法 迭代器 總結    基本屬性 transient int size = 0; transient Node<E> f

java實現佇列MyQueue,底層使用連結串列實現

/** * 佇列的介面 * 佇列是一種先進先出的資料結構 * 佇列支援的操作: * 判斷佇列是否為空 * 判斷佇列是否已經滿了 * 檢視佇列已經有多少元素 * 將一個元素入隊 * 將一個元素出隊 * 檢視隊頭的元素,但不出隊 * 佇列在底層可

java連結串列 分別用內部類和外部類實現

        在這裡我將使用外部類和內部類兩種方法來實現java的連結串列,參考了java老師上課講過的程式碼~         主要思想是:首先要有一個Node類(節點類),其成員變數為String 型別的name,還有一個Node型別的next,作為指向下一個節點的指

Java資料結構之——棧:用連結串列實現

class Node<E>{ E data; Node<E> next = null; public Node(E data){ this.data = data; } } public class ListStack<

Java連結串列實現

     傳統的物件陣列一旦宣告則長度不可改變,因此,操作起來較為繁雜。 連結串列從本質上講可以理解為“動態的物件陣列”。連結串列可以實現物件的增加、刪除、查詢等等一系列的操作,可以實現動態擴充。如下為連結串列的實現: package cn.mldn.java; // 1

連結串列實現棧(Java版)

/** /** * 用單鏈表實現棧 * * 表示連結串列的一個節點 * @author ly * */ public class Node { Object element; Node next; public Node(Object element){ this(elemen

JAVA基於陣列實現集合和基於連結串列實現集合

1.定義一個介面MyListpublic interface MyList { //增 void add(int num); //刪 boolean delete(int index2); //改 boolean update(int index2, int n

Java 連結串列的底層實現

package com.soto.collection; /** * add 和 get方法 * * @author 王 * */ public class SxtLinkedList /*implements List*/ { //雙向連結串列, pri