java 数据结构单链表的操作
一、手写一个单链表
public class ListNode<T>{
/**
* 数据
*/
public T obj;
/**
* tail 指针
*/
public ListNode next;
ListNode(T obj){
this.obj = obj;
}
}
创建单链表工具类
public class ListNodeUtils {
/**
* 单链表头部插入新节点
* @param head 链表头节点
* @param newHead 要插入的头节点
*/
public static void insertHead(ListNode head, ListNode newHead){
ListNode oldHead = head; //保存原头节点
head = newHead; //新的头节点赋值给原头节点
head.next = oldHead; //新的头节点指向原头节点
}
/**
* 单链表尾部插入新节点
* @param tail 链表尾节点
* @param newTail 要插入的尾节点
*/
public static void insertTail(ListNode tail, ListNode newTail){
ListNode oldTail = tail; //保存原来的尾节点
tail = newTail;//赋值新的尾节点给原来的尾节点
oldTail.next = tail;//旧的尾节点指向新的尾节点
tail.next = null;//新的尾节点指向NULL
}
/**
* 单链表在node1之后插入node2
* @param node1
* @param node2
*/
public static void insetNode(ListNode node1, ListNode node2){
ListNode next = node1.next;//保存原节点的下个节点
node1.next = node2;//node1节点指向node2节点
node2.next = next;//node2节点指向node1的下个节点
}
/**
* 删除节点
* @param head
* @param delNode
*/
public static void delNode(ListNode head, ListNode delNode){
//删除非 尾节点
if(delNode != null && delNode.next != null){
ListNode next = delNode.next;//保存下个节点
delNode.obj = next.obj;//将下个节点的值赋值给当前节点
delNode.next = next.next;//将该节点指向下个节点的下个节点
next = null;//释放需要删除的节点
}
//删除尾节点
if(delNode.next == null){
while (head != null){
if(head.next != null && head.next == delNode){
head.next = null;
delNode = null;
}
head = head.next;
}
}
}
/**
* 查找节点
* @param head 头节点
* @param obj 需要查找节点
*/
public static <T> int findNode(ListNode head, T obj){
int index = 0;
while (head != null){
if(head.obj.equals(obj)){
return index;
}
index ++;
head = head.next;
}
return index;
}
/**
* 遍历单链表
* @param head 头节点
*/
public static void cycleNode(ListNode head){
while(head != null){
System.out.print(head.obj + "; ");
head = head.next;
}
System.out.println();
}
}
测试单链表工具类的方法
public static void main(String[] args) {
//创建三个节点
ListNode listNode1 = new ListNode("这是节点1");
ListNode listNode2 = new ListNode("这是节点2");
ListNode listNode3 = new ListNode("这是节点3");
//创建节点指向关系
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = null;
cycleNode(listNode1);
//头部插入测试
ListNode listNode0 = new ListNode("这是节点0");
insertHead(listNode1, listNode0);
cycleNode(listNode0);
//尾部插入测试
ListNode listNode4 = new ListNode("这是节点4");
insertTail(listNode3, listNode4);
cycleNode(listNode0);
//中间插入 node2后插入 node5
ListNode listNode5 = new ListNode("这是节点5");
insetNode(listNode2, listNode5);
cycleNode(listNode0);
//删除节点
delNode(listNode0, listNode5);
cycleNode(listNode0);
//查找节点
System.out.println(findNode(listNode0, "这是节点3"));
}
运行结果:
这是节点1; 这是节点2; 这是节点3; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 这是节点0; 这是节点1; 这是节点2; 这是节点5; 这是节点3; 这是节点4; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 3

浙公网安备 33010602011771号