java小白,记录实现单链表操作;
处理步骤
1、定义一个节点
定义一个Node类,包含两部分,data和next
通过构造函数来传值
class Node{
//存储真实数据
int data;
//指针引用 next 指向下一个节点对象
Node next;
//无参构造函数 (通过构造函数传值)
public Node(int data){
this.data = data;
}
}
2、增加节点
逻辑是先处理头结点,然后通过遍历找到尾节点,给尾节点赋值;
只为实现单链表,其他情况比较麻烦,这里只考虑尾插情况;
//2.1定义一个头结点(必须先有一个头结点)
Node head;
//链表的长度
int size;
//2.2增加节点,这里只考虑尾插的情况,按顺序在尾部追加数据
public void addNode(int data){
//2.2.1头结点的处理
if (head == null){
head = new Node(data);
size++;
return;
}
//2.2.2找到尾节点 遍历尾节点
Node temp = head;
while (temp.next != null){
temp = temp.next;
}
//2.2.3找到尾节点,对其赋值
temp.next = new Node(data);
size++;
}
3、删除节点
依据链表的长度size来删除,增加节点就+1,删除节点就-1
删除时要考虑一些特殊情况:空链表,异常索引,删除头结点
//3.删除节点
public Node deleteNode(int index){
//处理空链表
if (size == 0){
return null;
}
//处理异常索引
if (index < 1 || index > size){
return null;
}
//删除头结点
if (index == 1){
Node temp = head;
head = head.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{
preNode = cureNode;
cureNode = cureNode.next;
}
}
return cureNode;
}
4、打印链表,返回链表长度
//4.打印链表
public void printList(){
Node cureNode = head;
//循环遍历到尾节点
while (cureNode != null){
System.out.println(cureNode.data + "");
cureNode = cureNode.next;
}
}
//返回链表长度
public int getSize(){
return size;
}
完整代码
public class LinkedList {
//1.定义一个节点
class Node{
//存储真实数据
int data;
//指针引用 next 指向下一个节点对象
Node next;
//无参构造函数 (通过构造函数传值)
public Node(int data){
this.data = data;
}
}
//2.1定义一个头结点
Node head;
//链表的长度
int size;
//2.2增加节点,这里只考虑尾插的情况,按顺序在尾部追加数据
public void addNode(int data){
//头结点的处理
if (head == null){
head = new Node(data);
size++;
return;
}
//找到尾节点 遍历尾节点
Node temp = head;
while (temp.next != null){
temp = temp.next;
}
//找到尾节点,对其赋值
temp.next = new Node(data);
size++;
}
//3.删除节点
public Node deleteNode(int index){
//处理空链表
if (size == 0){
return null;
}
//处理异常索引
if (index < 1 || index > size){
return null;
}
//删除头结点
if (index == 1){
Node temp = head;
head = head.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{
preNode = cureNode;
cureNode = cureNode.next;
}
}
return cureNode;
}
//4.打印链表
public void printList(){
Node cureNode = head;
//循环遍历到尾节点
while (cureNode != null){
System.out.println(cureNode.data + "");
cureNode = cureNode.next;
}
}
//返回链表长度
public int getSize(){
return size;
}
}
新建main方法测试
public class MyList {
public static void main(String[] args){
LinkedList linkedList = new LinkedList();
//插入节点
linkedList.addNode(10);
linkedList.addNode(20);
linkedList.addNode(30);
//打印链表并返回链表长度
linkedList.printList();
System.out.println(linkedList.getSize());
System.out.println("--------------------------");
//删除节点2
linkedList.deleteNode(2);
//打印链表并返回链表长度
linkedList.printList();
System.out.println(linkedList.getSize());
}
}
执行结果如下
10
20
30
3
--------------------------
10
30
2
完结,撒花