/**
* @Author: subd
* @Date: 2019/5/6 15:51
*/
public class SingleNodeList<E> {
Node head;
Node last;
int size;
private static class Node<E> {
E item;
Node<E> next;
Node(E element) {
this.item = element;
}
@Override
public String toString() {
return item.toString();
}
}
public void add(E e) {
Node<E> newNode = new Node(e);
//第一次添加
if (last == null) {
head = newNode;
last = newNode;
} else {
last.next = newNode;
last = newNode;
}
size++;
}
public void add(int index, E e) {
Node<E> newNode = new Node(e);
if (index <= size && index >= 0) {
if (size == 0) {
//空链表
head = newNode;
last = newNode;
} else if (size == index) {
//尾部追加
last = newNode;
last.next = newNode;
} else {
//中间插入
Node<E> pre = head;
Node<E> next = head.next;
int i = 1;
while (i < index) {
pre = next;
next = next.next;
i++;
}
pre.next = newNode;
newNode.next = next;
}
} else {
throw new IndexOutOfBoundsException("索引越界!");
}
size++;
}
public E get(int index) {
if (index >= 0 && index <= size) {
int i = 0;
Node<E> node = head;
while (i < index) {
node = node.next;
i++;
}
return node.item;
} else {
throw new IndexOutOfBoundsException("索引越界!");
}
}
public boolean remove(int index) {
if (index >= 0 && index <= size) {
if (size - 1 == 0) {
//移除开头
head = head.next;
size--;
return true;
} else {
//移除中间索引位置 移除最后一个也要这样走一个O(n)
int i = 0;
Node<E> node = head;
while (i < index - 1) {
node = node.next;
i++;
}
//索引处的节点
Node<E> cur = node.next;
if (cur != null) {
node.next = cur.next;
}
size--;
return true;
}
} else {
throw new IndexOutOfBoundsException("索引越界!");
}
}
public boolean remove(E e) {
if (size <= 0) {
throw new IndexOutOfBoundsException("索引越界!");
}
Node<E> node = head;
int i = 0;
while (node != null) {
if (node.item.equals(e)) {
remove(i);
}
i++;
node = node.next;
}
return true;
}
public void reverse() {
if (size <= 1) {
return;
}
Node<E> pre = head;
Node<E> cur = head.next;
Node<E> tmp;
while (cur != null) {
tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
last = pre;
head.next = null;
head = last;
}
/**
* 递归方式
*
* @param head
*/
public void reverse(Node head) {
if (head == null || head.next == null) {
//将未入栈的初始list的尾部赋给head
this.head = head;
return;
}
//压栈
reverse(head.next);
//出栈
head.next.next = head;
head.next = null;
//最后一个出栈的赋给last
last = head;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Node<E> node = head;
for (int i = 0; i < size; i++) {
sb.append(node.toString());
node = node.next;
}
return "SingleNodeList{" +
sb.toString() +
'}';
}
public static void main(String[] args) {
SingleNodeList<Integer> list = new SingleNodeList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// list.remove(2);
// list.remove(4);
list.reverse();
System.out.println(list.toString() + "size:" + list.size);
}
}
单向链表
最新推荐文章于 2020-11-23 20:22:57 发布
该博客主要展示了单向链表的 Java 实现代码。包含了添加、获取、移除元素等基本操作,还实现了链表反转的迭代和递归方法。代码中对索引越界情况进行了处理,确保操作的安全性,体现了单向链表的基本算法逻辑。

12万+

被折叠的 条评论
为什么被折叠?



