Java实现单链表的增删查改及逆置打印
阅读原文时间:2023年07月09日阅读:2

//所提供的接口

LinkList.java

package Struct;

public interface LinkList {
//判断链表为空
public boolean linkListIsEmpty();
//尾插
public void linkListPushBack(Object obj);
//尾删
public void linkListPopBack();
//头插
public void linkListPushFront(Object obj);
//头删
public void linkListPopFront();
//打印链表
public void disPlayList(LNode node);
//查找元素在链表中的位置
public int linkListFindByEle(LNode node,Object to_find);
//指定位置查找
public Object linkListFindByIndex(int index);
//在pos之后插入元素
public void linkListInsertAfter(LNode node,int pos,Object obj);
//删除指定值的元素
public void linkListRemove(LNode node,Object to_delete);
//删除指定位置的元素
public void linkListErase(int pos);
//求链表长度
public int linkListSize();
//链表的逆置
public LinkList2 reverseList(LinkList2 linkList2);

}

//接口的实现

LinkList2.java

package Struct;
class LNode{
LNode nextNode;//下一个节点的引用
Object obj;//节点的元素
public int length;

//构造函数
public LNode(Object obj){
this.obj = obj;
}
}

public class LinkList2 implements LinkList {

LNode head = null;//创建一个空链表
LNode tail = head;//尾节点,并记录当前节点的位置
int count = 0;//统计节点的个数

//判断链表是否为空
public boolean linkListIsEmpty() {
return(count==0);
}
//尾插
public void linkListPushBack(Object obj){
LNode node = new LNode(obj);
if(head == null){
head = node;//链表为空直接插入
}else{
tail.nextNode = node;//链表非空直接在tail当前节点的位置进行尾插
}
count++;
tail = node;//置node为前节点
}
//尾删
public void linkListPopBack() {
if(head == null){
return;//空链表不可进行尾删操作
}else{
while(head.nextNode == tail){
head = head.nextNode;
}
head.nextNode.nextNode = null;
}
count--;
}
//头插
public void linkListPushFront(Object obj) {
LNode node = new LNode(obj);
if(head == null){
head = node;
}else{
node.nextNode = head;
head = node;//改变头结点的位置
}
count++;
}
//头删
public void linkListPopFront(){
if(head == null){
return;//空链表无可删除元素
}else{
head = head.nextNode;
}
count--;
}
//打印链表(node表示从哪个节点开始打印)
public void disPlayList(LNode node) {
if(node != null){
System.out.print(node.obj);
System.out.print(" ");
node = node.nextNode;
disPlayList(node);//递归调用打印函数
}
System.out.println();
}

//查找元素在链表中的位置
public int linkListFindByEle(LNode node,Object to_find) {
if(head == null){
return -1;//表示空链表,未找到
}else{
int index = 0;
for(;node.obj!=to_find;){
node = node.nextNode;
index++;
}
return index;
}
}

//查找指定位置的元素
public Object linkListFindByIndex(int index){
LNode node = head;
if(index >= count){
System.out.println("indexOutOfBoundsException!");
return -1;//查找位置超过链表长度
}
for(int i = 0;i < index;i++){ node = node.nextNode; } return node.obj; } //在指定位置后插入元素 public void linkListInsertAfter(LNode node,int pos,Object obj){ LNode node1 = new LNode(obj); if(head == null){ head = node;//空链表直接插入,即pos无效 }else{ for(int index = 0;index!=pos;index++){ node = node.nextNode; } LNode node2 = node.nextNode; node.nextNode = node1; node1.nextNode = node2; } count++; } //删除指定值的元素 public void linkListRemove(LNode node,Object to_delete) { if(head == null){ return;//空链表无可删除元素 }else{ for(;node.nextNode.obj != to_delete;){ node = node.nextNode; } node.nextNode = node.nextNode.nextNode; } count--; } //删除指定位置的元素 public void linkListErase(int pos){ if(pos >= count){
//要查找的下标超过链表长度
System.out.println("indexOutOfBoundsException!");
return;
}
LNode node = head;
//要删除节点为第一个节点
if(pos == 0){
head = head.nextNode;
count--;
return;
}
//要删除节点为尾节点
if(pos == count-1){
//需要找到最后一个节点大的前一个节点
int temp = 0;
if(node != null && temp < pos-1){ //要删除节点的前一个节点 node = node.nextNode; temp++; } count--; return; } //要删除节点为中间节点 int temp1 = 0; if(node != null && temp1 < pos-1){ node = node.nextNode; temp1++; } node.nextNode = node.nextNode.nextNode; count--; } //求链表长度 public int linkListSize() { return count; } //链表的逆置 public LinkList2 reverseList(LinkList2 linkList){ LinkList2 reverseLinkList = new LinkList2(); for(int i = count - 1;i >= 0;i--){
reverseLinkList.linkListPushBack(linkList.linkListFindByIndex(i));
}
return reverseLinkList;
}

}

//测试代码

package Struct;

/**
 * @作者:dyy
 * @公司:陕西科技大学
 * @修改日期:
 * @邮箱:1101632375@qq.com
 * @描述:
 */
public class TestLinkList2 {
public static void main(String[] args) {
LinkList2 link = new LinkList2();
        System.out.println(link.linkListIsEmpty());
        System.out.println("尾插四个元素");
   link.linkListPushBack(1);
link.linkListPushBack(2);
link.linkListPushBack(3);
link.linkListPushBack(4);
link.disPlayList(link.head);
System.out.println("查找指定元素所在下标");
System.out.println(link.linkListFindByEle(link.head, 1));
System.out.println("查找指定下标的元素");
System.out.println(link.linkListFindByIndex(3));
link.linkListPopBack();
link.linkListPopBack();
System.out.println("尾删两个元素:");
link.disPlayList(link.head);
System.out.println("头插两个元素:");
link.linkListPushFront("lemon");
link.linkListPushFront("demon");
link.disPlayList(link.head);
System.out.println("指定位置后插入");
link.linkListInsertAfter(link.head, 2, 5);
link.disPlayList(link.head);
System.out.println("链表长度:");
System.out.println(link.linkListSize());
System.out.println("删除指定值的元素");
link.linkListRemove(link.head,"lemon");
link.disPlayList(link.head);
System.out.println("头删两个元素:");
link.linkListPopFront();
link.linkListPopFront();
link.disPlayList(link.head);
System.out.println("链表长度:");
System.out.println(link.linkListSize());
System.out.println("最终链表为:");
link.linkListPushFront("哈哈");
link.linkListPushFront(57);
link.linkListInsertAfter(link.head, 2, 2);
link.disPlayList(link.head);

System.out.println("链表长度:");
System.out.println(link.linkListSize());

System.out.println("删除指定位置的元素:");
link.linkListErase(4);
link.linkListErase(1);
link.disPlayList(link.head);
System.out.println("删除后链表长度:");
System.out.println(link.linkListSize());

System.out.println("逆置后的链表");
link = link.reverseList(link);
link.disPlayList(link.head);
}

}

运行结果: