package cn.yang.com;
public class MyLinkedList {
//定义一个头节点
Node head;
//链表的长度
int size;
class Node {
//真实数据
int data;
//next指针,指向下一个节点对象
Node next;
//构造函数
public Node(int data) {
this.data = data;
}
}
//增加节点,顺序插入,也就是在尾部追加数据
public void addNode(int data) {
//头节点处理 如果头节点为null,那么直接将data放入头节点里
if (head == null) {
head = new Node(data);
size++;
return;
}
//遍历到尾节点 如果头节点不为null,那么直接生成一个临时节点,将头节点赋予临时节点
Node temp = head; //赋予临时节点
while (temp.next != null) { //遍历到尾节点,如果 next 不为null,那么一直往后遍历,直到取到末节点
temp = temp.next;
}
//跳出循环,尾节点找到
//找到尾节点,赋值
temp.next = new Node(data); //将尾节点的next元素设置为data
size++; //链表长度+1
}
public Node deleteNode(int index) { //删除节点方法
//处理空链表
if (size == 0) { //如果size==0代表空链表,直接返回null就okay
return null;
}
//处理异常索引
if (index < 1 || index > size) {//处理索引异常判断
return null;
}
//删除头节点
if (index == 1) { //索引为1
Node temp = head; //将头节点赋予临时节点
head = head.next; //将头节点的next节点变为头节点
size--;
return temp;
}
//删除非头节点
//从头节点的下一个节点开始遍历
Node cureNode = head.next;
//记录当前循环的节点的上一个节点用于删除当前节点
Node preNode=head;
int i=2;
while(cureNode!=null){
if(i==index){ //判断是否删除该元素
//要删除的就是此节点
preNode.next=cureNode.next;
size--;
break;
}else{ //else将当前节点重新赋值,并将 i++
preNode=cureNode;
cureNode=cureNode.next;
i++;
}
}
return cureNode;
}
//打印链表
public void printList(){
Node curNode=head;
//循坏遍历到尾节点
while(curNode!=null){
System.out.print(curNode.data+" ");
curNode=curNode.next;
}
System.out.println();
}
//返回链表长度
public int getSize(){
return size;
}
public static void main(String[] args) {
MyLinkedList myLinkedList=new MyLinkedList();
myLinkedList.addNode(10);
myLinkedList.addNode(20);
myLinkedList.addNode(30);
myLinkedList.printList();
System.out.println("链表长度= "+myLinkedList.getSize());
System.out.println("------------删除链表-------------");
Node node = myLinkedList.deleteNode(3);
System.out.println("删除的节点数据是:"+node.data);
myLinkedList.printList();
System.out.println("链表长度= "+myLinkedList.getSize());
}
}
Java 手写单向链表
最新推荐文章于 2025-04-22 21:50:45 发布