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