此文章主要实现单链表的基本操作。
我也是一位学习者,如果有任何问题,欢迎私信交流学习!
提示:以下是本篇文章正文内容,下面案例可供参考
首先我们需要定义两个类:结点类(Node)、单链表(SingleLinkList)
结点类主要用于存储数据和下一个结点的地址
单链表主要用于存储结点以及基本操作
代码如下(示例):
结点类(Node)
public class LinkListNode {
private Integer data; // 结点的数据域
private LinkListNode next; // 下一个结点
}
单链表(SingleLinkList)
public class SingleLinkList {
private LinkListNode head;//定义单链表的头结点
private int length;//用来记录单链表的长度
}
/**
* 单链表的初始化 init() 无参
*/
public SingleLinkList(){
this.head = new LinkListNode();
}
/**
* 单链表的初始化 init() 有参
* */
public SingleLinkList(Integer data,LinkListNode next){
this.head = new LinkListNode();
LinkListNode node = new LinkListNode();
node.setData(data);
node.setNext(next);
head.setNext(node);
}
/**
* 求单链表长度
*/
public int getLength(){
return length;
}
/**
* 新增:默认在最后插入一个数据元素;
*/
public LinkListNode insert(Integer data){
LinkListNode newNode = new LinkListNode(data);
LinkListNode p = head;
while (p.getNext()!=null){
p = p.getNext();
}
p.setNext(newNode);
length++;
return newNode;
}
/**
* 新增:在位置i插入一个数据元素;
*/
public void insertByIndex(int index,Integer data){
// 如果位置i大于了单链表的长度 或者 位置不合理 则直接将新结点添加到最后
if(index>length||index-1<0){
insert(data);
return;
}
index--;
// 将指针p指向首元结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
LinkListNode newNode = new LinkListNode(data,p.getNext());
p.setNext(newNode);
length++;
}
/**
* 查找:按位置查找
*/
public Integer getByIndex(int index){
// 如果查找的元素大于了单链表的长度则返回null
if(index>length){
return null;
}
// 将指针p指向头结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
return p.getData();
}
/**
* 查找:按值查找
*/
public int getByData(Integer data){
// 将指针p指向首元结点
LinkListNode p = head;
int index = 0;
while (p.getNext()!=null){
p=p.getNext();
index++;
if(p.getData().equals(data)){
return index;
}
}
if(index==length&&!p.getData().equals(data)){
return 0;
}
return index;
}
/**
* 查找:遍历单链表
*/
public void traverse(){
LinkListNode p = head;
while (p.getNext()!=null){
p = p.getNext();
System.out.println("结点值:"+p.getData());
}
}
/**
* 删除:按位置i删除数据元素;
*/
public Integer deleteByIndex(int index){
// 如果位置i大于了单链表的长度则返回null
if(index>length||index-1<0){
return null;
}
// 提前将index-- 是为了将p指针移到被删除元素的前一个位置
index--;
// 将指针p指向头结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
int res = p.getNext().getData();
p.setNext(p.getNext().getNext());
length--;
return res;
}
/**
* 合并链表
*/
public void marge(SingleLinkList singleLinkList){
LinkListNode p = head;
length=length+singleLinkList.length;
while (p.getNext()!=null){
p = p.getNext();
}
p.setNext(singleLinkList.head.getNext());
}
结点类:LinkListNode
package experiment_01;
public class LinkListNode {
private Integer data; // 结点的数据域
private LinkListNode next; // 下一个结点
public LinkListNode(){
}
public LinkListNode(Integer data){
this.data = data;
this.next = null;
}
public LinkListNode(Integer data,LinkListNode next){
this.data = data;
this.next = next;
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public LinkListNode getNext() {
return next;
}
public void setNext(LinkListNode next) {
this.next = next;
}
}
单链表类:SingleLinkList
public class SingleLinkList {
private LinkListNode head;//定义单链表的头结点
private int length;//用来记录单链表的长度
/**
* 单链表的初始化 init() 无参
*/
public SingleLinkList(){
this.head = new LinkListNode();
}
/**
* 单链表的初始化 init() 有参
* */
public SingleLinkList(Integer data,LinkListNode next){
this.head = new LinkListNode();
LinkListNode node = new LinkListNode();
node.setData(data);
node.setNext(next);
head.setNext(node);
}
/**
* 求单链表长度
*/
public int getLength(){
return length;
}
/**
* 新增:默认在最后插入一个数据元素;
*/
public LinkListNode insert(Integer data){
LinkListNode newNode = new LinkListNode(data);
LinkListNode p = head;
while (p.getNext()!=null){
p = p.getNext();
}
p.setNext(newNode);
length++;
return newNode;
}
/**
* 新增:在位置i插入一个数据元素;
*/
public void insertByIndex(int index,Integer data){
// 如果位置i大于了单链表的长度 或者 位置不合理 则直接将新结点添加到最后
if(index>length||index-1<0){
insert(data);
return;
}
index--;
// 将指针p指向首元结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
LinkListNode newNode = new LinkListNode(data,p.getNext());
p.setNext(newNode);
length++;
}
/**
* 查找:按位置查找
*/
public Integer getByIndex(int index){
// 如果查找的元素大于了单链表的长度则返回null
if(index>length){
return null;
}
// 将指针p指向头结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
return p.getData();
}
/**
* 查找:按值查找
*/
public int getByData(Integer data){
// 将指针p指向首元结点
LinkListNode p = head;
int index = 0;
while (p.getNext()!=null){
p=p.getNext();
index++;
if(p.getData().equals(data)){
return index;
}
}
if(index==length&&!p.getData().equals(data)){
return 0;
}
return index;
}
/**
* 查找:遍历单链表
*/
public void traverse(){
LinkListNode p = head;
while (p.getNext()!=null){
p = p.getNext();
System.out.println("结点值:"+p.getData());
}
}
/**
* 删除:按位置i删除数据元素;
*/
public Integer deleteByIndex(int index){
// 如果位置i大于了单链表的长度则返回null
if(index>length||index-1<0){
return null;
}
// 提前将index-- 是为了将p指针移到被删除元素的前一个位置
index--;
// 将指针p指向头结点
LinkListNode p = head;
while (index!=0){
p=p.getNext();
index--;
}
int res = p.getNext().getData();
p.setNext(p.getNext().getNext());
length--;
return res;
}
/**
* 合并链表
*/
public void marge(SingleLinkList singleLinkList){
LinkListNode p = head;
length=length+singleLinkList.length;
while (p.getNext()!=null){
p = p.getNext();
}
p.setNext(singleLinkList.head.getNext());
}
}
测试类:LinkListTest
import java.util.Scanner;
public class LinkListTest {
public static void main(String[] args){
// 初始化单链表
SingleLinkList singleLinkList = new SingleLinkList();
// 在链表尾部新增结点
singleLinkList.insert(15);
singleLinkList.insert(16);
singleLinkList.insert(17);
singleLinkList.insert(18);
Scanner scanner = new Scanner(System.in);
int operation = 0;
printList(singleLinkList);
while (operation!=-1) {
System.out.println("请选择一个操作:\n 1、遍历输出单链表 \n 2、根据位置查找结点的值 \n 3、根据值查找结点的位置 " +
"\n 4、在指定位置插入一个数据元素 \n 5、根据位置删除结点 \n 6、合并一个链表给你看看就行 \n 7、退出程序");
operation = scanner.nextInt();
switch (operation) {
case 1:
// 遍历输出单链表
printList(singleLinkList);
break;
case 2:
System.out.println("请问你要查找第几个结点的值?");
int index = scanner.nextInt();
System.out.println("第" + index + "个结点的值:" + singleLinkList.getByIndex(index));
break;
case 3:
System.out.println("请问你要查找值为多少的结点位置?");
Integer data = scanner.nextInt();
System.out.println("值为" + data + "的结点位置:" + singleLinkList.getByData(data));
break;
case 4:
System.out.println("请问你要在第几个位置插入结点?");
index = scanner.nextInt();
System.out.println("请问你要插入值为多少的结点?");
data = scanner.nextInt();
singleLinkList.insertByIndex(index, data);
break;
case 5:
System.out.println("请问你要删除哪个位置的结点?");
index = scanner.nextInt();
singleLinkList.deleteByIndex(index);
break;
case 6:
SingleLinkList singleLinkList2 = new SingleLinkList();
singleLinkList2.insert(1);
singleLinkList2.insert(2);
singleLinkList2.insert(3);
singleLinkList.marge(singleLinkList2);
break;
default:
System.exit(0);
}
}
}
public static void printList(SingleLinkList singleLinkList){
System.out.println("单链表的长度:"+singleLinkList.getLength());
singleLinkList.traverse();
}
}
希望大家可以一次性运行成功喔!
对不起了大家,今天没时间写了,下次补上。