Java数据结构 – 链表(没有使用静态方法)自学 头插
创建一个结点类
class Node {
public Object data;
public Node next;
public Node() {}
public Node(Object data) {
this.data = data;
}
}
创建开始构建链表以及相应的方法
public class LinkList {
private Node head;
private int size;
public LinkList() {
head = null;
size = 0;
}
/**
* 初始化(一个方法最好只做一件事)
*/
public void InitLinkList() {
System.out.println("请输入元素个数n");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println("请依次输入n个元素:");
while(n-- > 0) {
Object data = scanner.next();
Node temp = new Node(data);
temp.next = head;
head = temp;
size++;
}
}
/**
* 链表是否为空
* @return 为空 true
*/
public boolean IsEmpty() {
return size == 0;
}
/**
* 根据下标寻找下标结点的前一结点(方便进行插入删除操作)
* @param index 下标
* @return 返回要插入节点的前一个节点,没有则返回 null
*/
public Node findIndexNode(int index) {
int dex = 0;
Node tempHead = head;
while(tempHead != null) {
//找到插入结点之前的结点
if(dex == index - 1) {
System.out.println("寻找的将要操作结点的前一个结点为" + tempHead.data + " 下标为" + dex);
return tempHead;
}
tempHead = tempHead.next;
dex++;
}
return null;
}
/**
* 根据元素寻找下标
* @param data 要查找的元素
* @return 查找元素的下标
*/
public int findIndex(Object data) {
int index = -1;
Node tempHead = head;
while(tempHead != null) {
index++;
if(tempHead.data.equals(obj)) {
System.out.println("查找元素的下标为:" + index);
return index;
}
tempHead = tempHead.next;
}
return index;
}
/**
* 在表尾插入元素
* @param data 要插入元素
*/
public void InsertLinkList(Object data) {
InsertLinkList(size, data);
}
/**
* 在下标处插入
* @param index 插入的下标
* @param data 插入的数据
*/
public void InsertLinkList(int index, Object data) {
if(index < 0 || index > size) {
System.err.println("非法插入!");
return ;
}
Node temp = new Node(data);
Node node = findIndexNode(index);
//如果要插入下标前没有结点
if(node == null) {
temp.next = head;
head = temp;
size++;
return ;
}
//进行插入
temp.next = node.next;
node.next = temp;
size++;
}
/**
* 根据下标删除元素
* @param index 要删除的元素下标
*/
public void DeleteLinkList(int index) {
if(index < 0 || index > size) {
System.err.println("非法删除!");
return ;
}
Node temp = new Node();
Node node = findIndexNode(index);
if(node == null) {//删除元素的前一个元素为空(删除第一个)
//temp = head;
head = head.next;
//temp = null;
return ;
}
//进行删除
//temp = node.next;
node.next = node.next.next;
//temp = null;
}
/**
* 打印链表
*/
public void Print() {
Node headNode = head;
while (headNode != null) {
System.out.print(headNode.data + " ");
headNode = headNode.next;
}
System.out.println();
}
}
测试类
public class Test {
public static void main(String[] args) {
LinkList L = new LinkList();
System.out.println(L.IsEmpty());
L.InitLinkList();
System.out.println("链表长度size = " + L.getSize() + "\n插入之前元素:");
L.Print();
System.out.println();
L.InsertLinkList("(*^▽^*)");
L.InsertLinkList(L.getSize(), "嗨");
L.Print();
System.out.println("链表长度size = " + L.getSize() + "\n删除元素:");
L.DeleteLinkList(4);
L.Print();
}
}
打印的结果
true
请输入元素个数n
5
请依次输入n个元素:
1 2 3 4 5
链表长度size = 5
插入之前元素:
5 4 3 2 1
寻找的将要操作结点的前一个结点为1 下标为4
寻找的将要操作结点的前一个结点为(▽) 下标为5
5 4 3 2 1 (▽) 嗨
链表长度size = 7
删除元素:
寻找的将要操作结点的前一个结点为2 下标为3
5 4 3 2 (▽) 嗨