class LinkedNode {
public int data = 0;
public LinkedNode next = null;
public LinkedNode(int data) {
this.data=data;
}
}
public class LinkedList {
private LinkedNode head = null;
//头插
public void addFirst(int elem) {
LinkedNode node = new LinkedNode(elem);
if (this.head == null) {
this.head = node;
return;
}
node.next = head;
this.head = node;
}
//打印链表
public void disPlay() {
System.out.print("[");
for (LinkedNode node = this.head; node != null;
node=node.next) {
System.out.print(node.data);
if (node.next != null) {
System.out.print(", ");
}
}
System.out.println("]");
}
//尾插
public void addLast(int elem) {
LinkedNode node = new LinkedNode(elem);
//空链表:
if (this.head == null) {
this.head = node;
return;
}
//非空情况,需要先找到最后一个节点
LinkedNode cur = this.head;
while (cur.next != null) {
cur = cur.next;
}
cur.next = node;
}
//往任意位置插入
public void addIndex(int index, int elem) {
LinkedNode node = new LinkedNode(elem);
//插入前先对pos校验,需要知道链表的长度
int len = size();
if (index < 0 || index > len) {
return;
}
if (index == 0) {
//插入第0个位置,就是头插
addFirst(elem);
return;
}
if (index == len) {
//这样就是尾插
addLast(elem);
return;
}
//中间位置的插入
//prev 对应到index-1的位置
//插入节点,只需找到插入的上一个节点就行
LinkedNode prev = getIndexPos(index - 1);
node.next = prev.next;
prev.next = node;
}
//获取某一位置节点的方法
private LinkedNode getIndexPos(int index) {
LinkedNode cur = this.head;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
return cur;
}
//获取链表的长度
public int size(){
int size = 0;
for (LinkedNode node = this.head;
node != null; node = node.next) {
size += 1;
}
return size;
}
//判断是否存在toFind
public boolean contains(int toFind) {
for (LinkedNode cur = this.head; cur != null; cur = cur.next) {
if (cur.data == toFind);
return true;
}
return false;
}
//删除元素
public void remove(int toRemove) {
//1.单独处理下空链表的情况
if (head == null) {
return;
}
//2.先看看要删除的是不是头节点
if (head.data == toRemove) {
this.head = this.head.next;
return;
}
//删除中间的节点,先找到要删除的前一个节点
LinkedNode prev = searchPrev(toRemove);
if (prev == null){
return;
}
//prev.next = prev.next.next; 这样写虽然对,
//但是比较抽象
LinkedNode nodeToRemove = prev.next;
prev.next = nodeToRemove.next;
}
LinkedNode searchPrev(int toRemove) {
//找到要删除元素的前一个节点
if (this.head == null) {
return null;
}
LinkedNode prev = this.head;
while (prev.next != null) {
if (prev.next.data == toRemove) {
return prev;
}
prev = prev.next;
}
return null;
}
//删除所有的key
public void removeAllKey(int toRemove) {
if (head == null) {
return;
}
//先处理后续节点,最后处理头节点
LinkedNode prev = head;
LinkedNode cur = head.next;
while (cur != null) {
if (cur.data == toRemove) {
prev.next = cur.next;
return;
} else {
prev = cur;
cur = cur.next;
}
}
//头节点的情况
if (this.head.data == toRemove) {
this.head = this.head.next;
}
return;
}
public void clear() {
this.head = null;
}
//找到链表的中间节点
public LinkedNode findCentre(LinkedNode node) {
int len = 0;
for (LinkedNode cur = node; cur != null; cur = cur.next) {
len += 1;
}
LinkedNode centre = node;
for (int i = 0; i < len / 2; i++) {
centre = centre.next;
}
return centre;
}
//输出链表的倒数第k个节点
public LinkedNode findK(LinkedNode node, int k) {
int len = 0;
for (LinkedNode cur = node; cur != null; cur = cur.next) {
len += 1;
}
if (node == null || k <= 0 || len < k) {
return null;
}
for (int i = 0; i < len - k; i++) {
node = node.next;
}
return node;
}
}