赞
踩
此文章主要实现单链表的基本操作。
我也是一位学习者,如果有任何问题,欢迎私信交流学习!
提示:以下是本篇文章正文内容,下面案例可供参考
首先我们需要定义两个类:结点类(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(); } }
希望大家可以一次性运行成功喔!
对不起了大家,今天没时间写了,下次补上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。