Linklist程式碼實現以及程式碼解讀

GOZO發表於2024-10-23
package 集合框架.LinkList;

import org.w3c.dom.Node;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class LinkListTest<E> {
public static class Node<E> {
/**
* @param element儲存元素
* @param next下一個元素
* @param prev上一個元素
*/
E element;
Node<E> next;
Node<E> prev;

public Node(E element, Node<E> next, Node<E> prev) {
this.element = element;
this.next = next;
this.prev = prev;
}
}

private Node<E> first;
private Node<E> last;
private Node<E> item;
private int size;
private int modCount;


public boolean add(E e){
LinkLast(e);
return true;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
Node<E> current = first;
while (current != null) {
sb.append(current.element);
if (current.next != null) {
sb.append(", ");
}
current = current.next;
}
sb.append("]");
return sb.toString();
}
public void LinkLast(E e){
final Node<E> l = last;
Node<E> NewNode = new Node<>(e,null,l);
last = NewNode;
//如果是空,說明頭節點和尾節點也為空,當前連結串列就一個元素時候,前後都指引為null
if (l == null){
first = NewNode;
}else{
//如果尾節點不為空,把尾節點指標指向新節點
l.next = NewNode;
}
size++;
}
//刪除
public E remove(int index){
//檢查索引是否越界
checkElementIndex(index);
//指定刪除元素,返回元素節點
return unlink(node(index));
}
Node<E> node(int index) {
//根據索引遍歷找到刪除元素引用
//如果小於集合一半,從前往後遍歷
//如果大於集合一半,從後往前遍歷
if(index < (size >> 1)){
Node<E> x = first;
for (int i = 0; i < index; i++){
x = x.next;
}
return x;
}else{
Node<E> x =last;
for (int i = size - 1; i > index; i--){
x = x.prev;
}
return x;
}
}
//斷開連線
public E unlink(Node<E> x){
//要刪除元素
E item = x.element;
//要刪除元素的上一個元素
Node<E> prev = x.prev;
//要刪除元素的下一個元素
Node<E> next = x.next;
//判斷是否是頭節點
if(prev == null){
//如果等於空是頭節點,那頭節點元素給下個元素
first = next;
}else{

//如果不是頭節點,就讓上一個元素指向下一個元素
//把要刪除元素的下個元素賦值給要刪除元素
prev.next = next;
//斷開與上個元素的引用
x.prev =null;
}
//判斷是否是尾節點
if(next == null){
//把尾部元素給上一個元素
last = prev;
}else{
//不是尾節點,就讓下一個元素指向上一個元素
prev.next = next;
x.next = null;
}
//陣列元素減去1一
size --;
//返回刪除元素
return item;
}
public void checkElementIndex(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
//改
public E set(int index, E element){
//檢查索引是否越界
checkElementIndex(index);
//獲取要修改元素
Node<E> node = node(index);
//這部分就是要改元素值
E oldValue = node.element;
node.element = element;
return oldValue;
}
//根據索引獲取元素

public E get(int index){
Node<E> node = node(index);
return node.element;
}
//根據元素獲取索引
public int indexOf(Object e){
int index = 0;
//如果元素等於null,返回null的這個元素的索引
if(e == null){
//不斷遍歷下一個元素
for (Node<E> x = first; x != null; x = x.next){
//下一個元素等於空返回索引
if (x.element == null){
return index;
}
index++;
}
}else{
for (Node<E> x = first ; x != null; x = x.next){
if (e.equals(x.element)){
return index;
}
index++;
}
}
return -1;
}
//查
public static void main(String[] args) {
LinkListTest<Integer> integerLinkListTest = new LinkListTest<>();
integerLinkListTest.add(1);
integerLinkListTest.add(2);
integerLinkListTest.add(3);
System.out.println(integerLinkListTest.indexOf(1));
}
}

相關文章