单向链表:
每个节点分为value区域和next区域,value是自己的值,next区域是下一个节点的地址
链表Node类:
package node;
public class Node {
Integer val;//定义一个节点的值
Node next;//定义下一个节点的地址,我们这个地方需要和我们的类名相同,只有这样我们才能记录下一个节点的地址。
public Node(Integer val) {
this.val = val;
}
}
链表管理类LinkList,实现增删改查
package node;
public class LinkList {
//定义链表的头结点
Node head = null;//主要目的:记录头结点的位置
//尾插法:链表的尾部插入数据
public void insert(int val) {
//创建节点
Node node = new Node(val);
//判断头记录是否为空
if (head == null) {
head = node;
return;
}
//定义指针
Node indexNode = head;
//进行变量
while (indexNode.next !=null) {
indexNode = indexNode.next;
}
indexNode.next = node;
}
//头插法
public void HeadInsert(int val) {
//创建节点
Node node = new Node(val);
//判断头记录是否为空
if (head == null) {
head = node;
return;
}
node.next = head;
head = node;
}
//输出遍历
public void printLink() {
Node indexNode = head;
while (indexNode !=null) {
System.out.println(indexNode.val);
indexNode = indexNode.next;
}
}
//输出链表长度
public int GetLength() {
int length = 0;
Node indexNode = head;
while (indexNode!=null) {
length++;
indexNode = indexNode.next;
}
return length;
}
//查询某个值是否在链表中
public boolean contains(int val) {
Node indexNode = head;
while (indexNode!=null) {
if (indexNode.val == val) {
return true;
}
indexNode = indexNode.next;
}
return false;
}
//位置插入
public void addNodeAtIndex(int val,int index) {
if(index == 0) {
HeadInsert(val);
}else if(index == GetLength()){
insert(val);
}else {
//插入在中间某个位置
//1.新建插入的节点
Node node = new Node(val);
//2.定义游标遍历链表
Node indexNode = head;
Node tempNode = null;//indexNode上一个位置
int position = 0;//位置
while (indexNode!=null) {
if (position == index) {
node.next = indexNode;
tempNode.next = node;
return;
}
tempNode = indexNode;
indexNode = indexNode.next;
position++;
}
}
}
//位置删除
public void removeNodeAtIndex(int index) {
Node proNode = head;//要删除位置的前一个节点
if (index<1) {//不删除节点
return;
}
if (index==1) {//删除第一个节点
head = head.next;
return;
}
while (index-->2) {//使Pronode指向第index个结点前面的一个节点
proNode = proNode.next;
}
proNode.next = proNode.next.next;//通过跳过结点来实现删除结点的效果
return;
}
}
测试类Test:
package node;
public class Test {
public static void main(String[] args) {
LinkList linkList = new LinkList();
linkList.insert(5);
linkList.insert(7);
linkList.HeadInsert(4);
linkList.HeadInsert(2);
linkList.HeadInsert(3);
linkList.printLink();
System.out.println("--------------");
System.out.println("反转:");
linkList.fanzhuan();
linkList.printLink();
System.out.println("--------------");
System.out.println("查询中间值");
Node node = linkList.findMid();
System.out.println(node.val);
System.out.println("--------------");
System.out.println("删除第二个值:");
linkList.removeNodeAtIndex(2);
linkList.printLink();
System.out.println("--------------");
linkList.NthFromEnd(2);
linkList.printLink();
}
}
输出结果: