单链表有两个关键变量:存储的元素(object)以及指向下一个节点的引用(next)
public class Node{
// 保存的元素
public Object data;
// 指向下一个节点
public Node next;
public Node() {
this(null);
}
public Node(Object data) {
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"data=" + data +
'}';
}
}
- 通过画图展示链表的插入处理
- 链表的删除处理:
代码实现:
public class MyLink {
// 初始化一个头结点
private Node head;
// 链表的大小
private int size;
public int getSize() {
return size;
}
// 头插法添加元素
public void addHead(Object data){
Node node = new Node(data);
if(head == null){
head = node;
size ++;
return;
}
// 新建的节点指向头结点
node.next = head;
// 然后再将新的节点变为头结点
head = node;
size ++;
}
// 尾插法添加元素
public void addTail(Object data){
Node node = new Node(data);
if(head == null){
head = node;
size ++;
return;
}
// 获取尾结点
Node tail = head;
while(tail.next != null){
tail = tail.next;
}
// 将尾节点的引用指向新的节点
tail.next = node;
size ++;
}
// 展示链表的数据
public void showData(){
Node temp = head;
while (true){
System.out.print(temp.data+ " ");
if(temp.next == null){
return;
}
temp = temp.next;
}
}
// 在链表中间插入元素
public void addByIndex(int index,Object data){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException();
}
if(index == 0){
this.addHead(data);
return;
}
if (index == size){
this.addTail(data);
return;
}
// 找到需要插入的节点的前节点和后节点
Node newNode = new Node(data);
// 找到需要插入的前节点
Node node1 = head;
for (int i = 0; i < index-1; i++) {
node1 = node1.next;
}
// 进行插入操作(前节点的引用指向新的节点,新的节点的引用指向后节点)
// Node node2 = node1.next; // node2表示前节点的后节点
// node1.next = newNode; 前节点指向新的节点
// newNode.next = node2; 新的节点直线前节点的后节点
newNode.next = node1.next;
node1.next = newNode;
size++;
}
// 获取某个节点的元素
public Object get(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException();
}
if(index == 0){
return head.data;
}
if (index == size){
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
return temp.data;
}
Node node = head;
for (int i = 0; i < index ; i++) {
node = node.next;
}
return node.data;
}
// 删除某个节点的元素
public void delete(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException();
}
if(index == 0){
head = head.next;
size --;
return;
}
if(index == size){
Node node = head;
while (node.next.next != null){
node = node.next;
}
node.next = null;
size --;
return;
}
// 找到待删除节点的前节点
Node node = head;
for (int i = 0; i < index-1; i++) {
node = node.next;
}
node.next = node.next.next;
size --;
}
public static void main(String[] args) {
MyLink myLink = new MyLink();
myLink.addTail("11111");
myLink.addTail("22222");
myLink.addTail("33333");
myLink.addTail("44444");
myLink.addTail("55555");
myLink.addHead("66666");
myLink.showData();
System.out.println("链表大小:"+myLink.getSize());
myLink.addByIndex(3,"ssdfsd");
myLink.showData();
System.out.println("链表大小:"+myLink.getSize());
System.out.println("获取某一节点的元素:"+myLink.get(6));
System.out.println("---------------删除节点----------------");
myLink.delete(7);
System.out.println("链表大小:"+myLink.getSize());
myLink.showData();
}
}
最终打印结果:
66666 11111 22222 33333 44444 55555 链表大小:6
66666 11111 22222 ssdfsd 33333 44444 55555 链表大小:7
获取某一节点的元素:55555
---------------删除节点----------------
链表大小:6