1. 程式人生 > >JAVA 單向鏈表

JAVA 單向鏈表

length 是否 index exception 拼接 引用變量 tail delet data

package com.session.link;

/**
* 單向鏈表
*/
public class LinkedList<T> {
private Node head;//指向鏈表頭節點的引用變量
private Node tail;//指向鏈表尾節點的引用變量
int size;//鏈表中當前總節點數

private class Node {
private T data;//保存數據
private Node next;//下一個節點

public Node(T data, Node next) {
this.data = data;
this.next = next;
}

}
//生成鏈表對象是一個空表
public LinkedList() {
head = null;
tail = null;
}

//生成鏈表對象時有一個頭節點 (有參構造器)
public LinkedList(T data) {
head = new Node(data, null);//指定一個頭節點的數據域值為data,不指向其他節點
tail = head;
size++;
}

//返回鏈表的長度
public int length() {
return size;
}

//獲取指定位置的元素
public T getElement(int index) {
return findNodeByIndex(index).data;
}

//查找 指定索引位置的節點
public Node findNodeByIndex(int index) {
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException("線性表索引越界");
}
Node current = head;//從頭節點開始下移遍歷
for (int i = 0; i < size & current.next != null; i++, current = current.next) {
if (i == index) {
return current;
}
}
return null;
}

//查找 指定元素的位置(查找數據域存放的是element的節點位置)
public int findIndexByElement(T element) {
Node current = head;//從第一個節點開始查找對比數據
for (int i = 0; i < size & current.next != null; i++, current = current.next) {
if (current.data.equals(element))
return i;
}
return -1;
}

//插入 在指定位置插入一個元素
public void insert(int index, T element) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("線性表索引越界");
}
if (head == null)//如果鏈表為空,直接調用add方法
{
add(element);
} else //鏈表不為空時
{
if (index == 0)//在鏈表頭插入
{
addAtHead(element);
} else {
Node prev = findNodeByIndex(index - 1);//找到要插入位置的前一個節點
prev.next = new Node(element, prev.next);//插入後prev的next指向新節點,新節點的next指向原來prev的下一個節點
size++;
}
}

}

//插入 尾插法在每次在鏈表尾添加新節點
public void add(T element) {
if (head == null) {
head = new Node(element, null);
tail = head;
} else {
Node newNode = new Node(element, null);
tail.next = newNode;
tail = newNode;
}
size++;
}

//插入 頭插法在鏈表頭部加入新節點
public void addAtHead(T element) {
//在頭部插入新節點,就是讓新節點的next指向原來的head,讓新節點作為鏈表的頭節點
head = new Node(element, head);
//newNode.next = head;
//head = newNode;
//如果插入之前是空鏈表
if (tail == null) {
tail = head;
}
}

//刪除指定位置的節點 返回刪除節點中的元素值
public T delete(int index) {
Node deleteNode = null;
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException("線性表索引越界");
}
if (index == 0)//刪除頭節點
{
deleteNode = head;
head = head.next;
} else { Node prev = findNodeByIndex(index - 1);//獲取要刪除的節點的前一個節點 deleteNode = prev.next;//要刪除的節點就是prev的next指向的節點 prev.next = deleteNode.next;//刪除以後prev的next指向被刪除節點之前所指向的next deleteNode.next = null; } return deleteNode.data; } //刪除 鏈表中最後一個元素 public T removeLast() { return delete(size - 1); } //清除鏈表中所有的元素 public void clear() { head = null; tail = null; size = 0; } //判斷鏈表是否為空 public boolean isEmpty() { return size == 0; } public String toString()//鏈表的輸出 重寫toString方法 { if(isEmpty()) { return "[]"; } else { StringBuilder sb = new StringBuilder("[");//使用StringBuilder類 for(Node current = head;current != null ; current = current.next)//從head開始遍歷 { sb.append(current.data.toString()+",");//把節點的數據拼接起來 } int len = sb.length(); return sb.delete(len-1,len).append("]").toString();//把最後一個元素的,刪除然後加上] } } public static void main(String[] args) { LinkedList<String> list = new LinkedList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); System.out.println(list); list.addAtHead("11"); list.insert(1,"22"); System.out.println(list); list.delete(2); System.out.println(list); list.clear(); System.out.println(list); new java.util.LinkedList<>().remove() }}

JAVA 單向鏈表