溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 實現(xiàn)自定義鏈表

發(fā)布時間:2020-07-28 08:52:19 來源:網(wǎng)絡 閱讀:289 作者:專注地一哥 欄目:編程語言

Java 實現(xiàn)自定義鏈表
節(jié)點類 Node.java
操作功能類 Link.java
App.java
節(jié)點類 Node.java
public class Node {
/ 當前節(jié)點的數(shù)據(jù)*/
private String data;
/* 如果當前節(jié)點是首/尾節(jié)點 NULL 或者是 下一個節(jié)點的實例/
private Node next;
public Node(final String data) {
this.data = data;
}
public void setNext(final Node next) {
this.next = next;
}
public Node getNext() {
return this.next;
}
public String getData() {
return this.data;
}
public void addNode(final Node newNode) {
if (this.next == null) {
this.next = newNode;
} else {
this.next.addNode(newNode);
}
}
public void printNode() {
System.out.println(this.data);
if (this.next != null) {
this.next.printNode();
}
}
public boolean containNode(final String data) {
/
比對當前節(jié)點數(shù)據(jù)是否相同*/
if (this.data.equals(data)) {
return true;
} else {
if (this.next != null) {
return this.next.containNode(data);
} else {
return false;
}
}
}
public void removeNode(final Node previous, final String data) {
/ 比對當前節(jié)點數(shù)據(jù)是否和將要刪除的數(shù)據(jù)相同*/
if (this.data.equals(data)) {
/* 數(shù)據(jù)相同的前提下 把下一個節(jié)點覆蓋到上一個節(jié)點的 next/
previous.next = this.next;
} else {
this.next.removeNode(this, data);
}
}
}
操作功能類 Link.java
public class Link {
private Node root;
public void add(final String data) {
if (data == null || this.contains(data)) {
return;
}
Node newNode = new Node(data);
if (this.root == null) {
this.root = newNode;
} else {
this.root.addNode(newNode);
}
}
public void print() {
if (this.root != null) {
this.root.printNode();
}
}
public boolean contains(final String data) {
if (data == null || this.root == null) {
return false;
}
return this.root.containNode(data);
}
public void remove(final String data) {
/
1. 首先判斷是否有相同數(shù)據(jù)節(jié)點*/
if (this.contains(data)) {
/ 2. 將要刪除的數(shù)據(jù)和當前根節(jié)點數(shù)據(jù)節(jié)點相同的話 把下一個節(jié)點覆蓋到根節(jié)點*/
if (this.root.getData().equals(data)) {
this.root = this.root.getNext();
} else {
/* 通過當前根節(jié)點和將要刪除的數(shù)據(jù), 刪除節(jié)點/
this.root.getNext().removeNode(this.root , data);
}
}
}
}
App.java
public class App {
public static void main(String[] args) {
final Link list = new Link();
list.add("饅頭");
list.add("豆?jié){");
list.add("茶葉蛋");
list.add("包子");
list.add("麻花");
list.add("豆?jié){");
/
刪除*/
list.remove("包子");
list.remove("豆?jié){");
/* 打印/
list.print();
/* 查詢/
System.out.println(list.contains("饅頭"));
System.out.println(list.contains("豆?jié){"));
}
}
結果:

饅頭
茶葉蛋
麻花
true
false
1.入門級
首先實現(xiàn)一個節(jié)點類:
package jimo.love;
public class Node {
private String data;//數(shù)據(jù)
private Node next;//指向下一個節(jié)點
public Node(String data){
this.data = data;
}
public void setNext(Node next){
this.next = next;
}
public Node getNext(){
return this.next;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
然后在主方法中生成節(jié)點,完成連接關系,并打印出來,看代碼有解釋:
package jimo.love;
public class Test {
public static void main(String[] args) {
//1.準備所有數(shù)據(jù)
Node head = new Node("頭節(jié)點");
Node n1 = new Node("n1");
Node n2 = new Node("n2");
head.setNext(n1);
n1.setNext(n2);
//2.取出所有數(shù)據(jù)
//方法一:
Node curNode = head;
while(curNode!=null){
System.out.println(curNode.getData());
curNode = curNode.getNext();
}
//方法二,遞歸方式:
print(head);
}
//采用遞歸方式
public static void print(Node curNode){
if(curNode==null){
return ;
}
System.out.println(curNode.getData());
print(curNode.getNext());
}
}
代碼中用了兩種方式取數(shù)據(jù),看執(zhí)行結果:
1
可以看到Main方法里寫的東西太多了,還要設置數(shù)據(jù),輸出數(shù)據(jù)。
但面向對象的思想讓我們不需要關注太多的東西和具體的實現(xiàn)。
所以我們需要ThinkMarkets返傭www.kaifx.cn/broker/thinkmarkets.html一個工具類,我們只關注存數(shù)據(jù)和取數(shù)據(jù),并不關心怎么存,怎么取。
2.中級
我們增加一個Link類用于業(yè)務操作:
public class Link {
private Node head;
public void add(String data){
Node newNode = new Node(data);
if(this.head==null){
this.head = newNode;//頭節(jié)點
}else{
//頭插法
// newNode.setNext(this.head.getNext());
// this.head.setNext(newNode);
//尾插法
this.head.addNode(newNode);
}
}
public void print(){
if(this.head!=null){
this.head.printNode();
}
}
}
其中的addNode和printNode方法來自Node類:
//遞歸添加節(jié)點
public void addNode(Node node){
if(this.next==null){
this.next = node;
}else{
this.next.addNode(node);
}
}
//遞歸打印節(jié)點
public void printNode(){
System.out.println(this.data);
if(this.next!=null){
this.next.printNode();
}
}
在主函數(shù)里:
Link link = new Link();
link.add("1");
link.add("2");
link.add("3");
link.print();
3.高級
在可用鏈表中,你不可能直接操作節(jié)點類吧,像這樣:
Node n = new Node("n");
所以,我們要讓Node類只能被Link類使用,具體方法是將Node類聲明為Link類的私有內部類:
4.終極
一個鏈表不可能只有一個add方法吧,接下來就完善方法:
1.size():取得元素個數(shù)
在Link類中聲明屬性count:
private int count = 0;
在add函數(shù)里自加:
this.count++;//增加完就++
返回size:
//取得數(shù)量
public int size(){
return this.count;
}
測試:
Link link = new Link();
link.add("1");
link.add("2");
link.add("3");
link.add(null);
System.out.println(link.size());
可以看到我添加了一個null元素,但也添加進去了,添不添加取決于自己4,我這里不讓添加,所以在add函數(shù)里修改:
if(null==data){
return ;
}
2.isEmpty():判斷鏈表是否為空:
public boolean isEmpty(){
return 0==this.count;
}
3.contains(data):判斷數(shù)據(jù)是否存在:
在Link類中:
//根據(jù)內容查詢數(shù)據(jù)
public boolean contains(String data){
if(null==data||null==this.head){
return false;
}else{
return this.head.containNode(data);
}
}
在Node類中:
public boolean containNode(String data){
if(data.equals(this.data)){
return true;
}else{
if(null!=this.next){
return this.next.containNode(data);
}else{
return false;//遞歸結束條件
}
}
}
4.get(int index):根據(jù)索引查找數(shù)據(jù):
在Link類添加屬性:
private int index = 0;
1
在Node類添加方法:
public String getNode(int index){
//注意Link.this.index
if(Link.this.index++==index){
return this.data;
}else{
return this.next.getNode(index);
}
}
注意:Link.this.index是內部類獲得外部類屬性的方法。
在Link類添加方法:
//通過索引查找內容
public String get(int index){
if(index >= this.count){
return null;
}
this.index = 0;//每次從頭向后查詢
return this.head.getNode(index);
}
注意:查找時索引從0開始,當然可以改成從1開始。
5.set(int index,data):根據(jù)索引修改內容:
其實和查找一樣,只是操作不同方而已:
在Node類:
public void setNode(int index,String data){
if(Link.this.index++==index){
this.data = data;
}else{
this.next.setNode(index, data);
}
}
在Link類:
//根據(jù)索引修改內容
public void set(int index,String data){
if(index >= this.count){
return ;
}else{
this.head.setNode(index,data);
}
}
6.remove(data):刪除一個元素:
這也是相對來說最復雜的部分,不過也很簡單。
在Node類:
//對非根節(jié)點的刪除
public void removeNode(Node preNode,String data){
if(data.equals(this.data)){
preNode.next = this.next;
}else{
this.next.removeNode(this, data);
}
}
在Link類,要判斷是否是根節(jié)點:
//刪除
public void remove(String data){
if(this.contains(data)){
//刪除根節(jié)點
if(data.equals(this.head.data)){
this.head = this.head.next;
}else{ //非根節(jié)點
this.head.next.removeNode(this.head, data);
}
this.count--;//別忘了
}
}
7.toArray():轉化成數(shù)組:
在Link類添加一個屬性:private String[] retArray;
在Node類:
public void toArrayNode(){
Link.this.retArray[Link.this.index++] = this.data;
if(null!=this.next){
this.next.toArrayNode();
}
}
在Link類:
public String[] toArray(){
if(null == this.head){
return null;
}
this.index = 0;
this.retArray = new String[this.count];
this.head.toArrayNode();
return this.retArray;
}
5.總結
以上代碼不能夠用于實戰(zhàn)開發(fā),只是為了理解引用關系的傳遞,后續(xù)的改進可以添加更多的方法,不用遞歸,加入泛型,做出和List一樣的效果。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI