package stackandqueue.stack.link;
/**
* @author tianzhuang
* @version 1.0
* @date 2021/11/25 16:46
*/
public class CirculeLink {
Node head = null;
int count = 0; // 添加一个统计链表数量的变量,操作链表会非常的方便
class Node{
private int val;
private Node next;
public Node(int val) {
this.val = val;
}
}
// 末尾添加元素
public void addNode(int val) {
Node node = new Node(val);
// 判断链表是否为空,为空将head指向node,node.next指向head
if (head == null) {
head = node;
node.next = head;
}
// 将指针指向最后一个节点
Node cur = head;
while (cur.next != head) {
cur = cur.next;
}
// 将cur的next指向node,node的next指向head
cur.next = node;
node.next = head;
count++;
}
// 删除元素
public void delNode(int val) {
if (head == null) {
System.err.println("链表为空");
}
// 判断首位元素与要删除的元素是否相同
if (head.val == val) {
head = head.next;
}
Node cur = head;
int size = count;
while (size-- != 0) {
// 必须要用cur.next.val 进行判断,若用cur.val判断是否相等,删除cur节点,无法操作将cur的上一个节点指向cur的下一个节点
if (cur.next.val == val) {
cur.next = cur.next.next;
count--;
}
cur = cur.next;
}
}
/**
* 在第一位添加节点
* @param val
*/
public void addHead(int val) {
Node node = new Node(val);
Node cur = head;
// 将新节点的next指向head,然后再将head指向新节点
node.next = head;
head = node;
int size = count;
// 将cur指向最后一个节点
// 为什么用--size,因为cur = cur.next是将指针指向第二个节点了,
// 如果此时用size--,则会造成size为0时,cur指向头节点了
while (--size != 0) {
cur = cur.next;
}
// 将最后一个节点的next指向head
cur.next = head;
count++;
}
// 在指定位置添加元素
public void addNodeByIndex(int index, int val) {
Node node = new Node(val);
if (index > (count+1) || index < 1 ) {
System.err.println("位置错误");
}
if (index == 1) {
addHead(val);
return;
}
int i = 1;
Node cur = head;
// 解析同addHead方法中的解析
while (++i < index) {
cur = cur.next;
}
// 将新增节点的next指向当前节点的next,
// 当前节点的next指向当前节点
node.next = cur.next;
cur.next = node;
count++;
}
// 在指定位置删除元素
public void delNodeByIndex(int index) {
if (index > (count+1) || index < 1 ) {
System.err.println("位置错误");
}
if (index == 1) {
head = head.next;
count--;
return;
}
int i = 1;
Node cur = head;
while (++i < index) {
cur = cur.next;
}
// 必须要操作cur.next,如果删除cur节点,无法操作将cur的上一个节点指向cur的下一个节点
cur.next = cur.next.next;
count--;
}
// 打印链表
public void printNode() {
Node cur = head;
int size = count;
while (size-- != 0) {
System.err.print(cur.val+"-");
cur = cur.next;
}
}
public static void main(String[] args) {
CirculeLink circuleLink = new CirculeLink();
circuleLink.addNode(1);
circuleLink.addNode(3);
circuleLink.addNode(5);
circuleLink.addNode(7);
circuleLink.addNode(9);
circuleLink.printNode();
System.err.println("============");
// 删除元素
/* circuleLink.delNode(5);
circuleLink.printNode();*/
// 指定位置添加元素
// circuleLink.addNodeByIndex(1, 2);
// 在首位添加节点
// circuleLink.addHead(0);
// 删除指定位置的元素
circuleLink.delNodeByIndex(5);
circuleLink.printNode();
}
}
Java实现单向循环链表的操作
最新推荐文章于 2024-04-28 11:56:49 发布