package cn.dragon.arithmetic.model;
import java.util.NoSuchElementException;
//单向链表
public class MySingleTrackLInkedList<T> {
private static class Node<T> {
T val;
Node<T> next;
public Node(T val) {
this.val = val;
this.next = null;
}
}
private Node<T> head;
private Node<T> tail;
private int size;
public MySingleTrackLInkedList() {
this.head = new Node<>(null);
this.tail = head;
this.size = 0;
}
public void addFirst(T d) {
Node<T> newNode = new Node<>(d);
newNode.next = head.next;
head.next = newNode;
if (size == 0) {
tail = newNode;
}
size++;
}
public void addLast(T d) {
Node<T> newNode = new Node<>(d);
tail.next = newNode;
tail = newNode;
size++;
}
public void add(int index, T element) {
checkPositionIndex(index);
if (index == size) {
addLast(element);
return;
}
Node<T> prev = head;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node<T> newNode = new Node<>(element);
newNode.next = prev.next;
prev.next = newNode;
size++;
}
public T removeFirst() {
if (isEmpty()) {
throw new NoSuchElementException();
}
Node<T> first = head.next;
head.next = first.next;
if (size == 1) {
tail = head;
}
size--;
return first.val;
}
public T removeLast() {
if (isEmpty()) {
throw new NoSuchElementException();
}
Node<T> prev = head;
while (prev.next != tail) {
prev = prev.next;
}
T val = tail.val;
prev.next = null;
tail = prev;
size--;
return val;
}
public T remove(int index) {
checkElementIndex(index);
Node<T> prev = head;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node<T> nodeToRemove = prev.next;
prev.next = nodeToRemove.next;
if (index == size - 1) {
tail = prev;
}
size--;
return nodeToRemove.val;
}
public T getFirst() {
if (isEmpty()) {
throw new NoSuchElementException();
}
return head.next.val;
}
public T getLast() {
if (isEmpty()) {
throw new NoSuchElementException();
}
return getNode(size - 1).val;
}
public T get(int index) {
checkElementIndex(index);
Node<T> p = getNode(index);
return p.val;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}
private void checkElementIndex(int index) {
if (!isElementIndex(index)){
throw new IndexOutOfBoundsException();
}
}
private void checkPositionIndex(int index) {
if (!isPositionIndex(index)) {
throw new IndexOutOfBoundsException();
}
}
private Node<T> getNode(int index) {
Node<T> p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p;
}
public static void main(String[] args) {
MySingleTrackLInkedList<Integer> list = new MySingleTrackLInkedList<>();
list.addFirst(1);
list.addFirst(2);
list.addLast(3);
list.addLast(4);
list.add(2, 5);
System.out.println(list.removeFirst()); // 2
System.out.println(list.removeLast()); // 4
System.out.println(list.remove(1)); // 5
System.out.println(list.getFirst()); // 1
System.out.println(list.getLast()); // 3
System.out.println(list.get(1)); // 3
}
}
数据结构-自定义单链表
Dragonlongbo2024-11-05 13:59
相关推荐
夜不会漫长2 小时前
C++:红黑树冻柠檬飞冰走茶4 小时前
PTA刷题集之Airline Routes(C语言实现)736c5 小时前
固件开发岗算法冻柠檬飞冰走茶5 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)PaperAccept10 小时前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率Tairitsu_H11 小时前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?Tairitsu_H12 小时前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?D e re k ZH1 天前
C++ 并发、未定义行为与工程化难点(No 3)La Pulga1 天前
【FreeRTOS源码学习笔记】链表的实现番茄味城市甜菜1 天前
数据结构:双向链表实现,链表与顺序表的对比