class SingleLinkList{
Node head=new Node();
public boolean isEmpty() {
return head.next==null;
}
//尾接法插入一个元素
public void insertIntoLast(Node element) {
Node temp=head;
while(temp.next!=null) {
temp=temp.next;
}
temp.next=element;
}
//插入,可以指定位置,超出链表大小时,默认插在最后
public void insert(Node element,int index) {
Node temp=head;
for(int i=0;i<index-1;i++) {
if(temp.next==null) {
break;
}
temp=temp.next;
}
element.next=temp.next;
temp.next=element;
}
//按照顺序插入,相同编号时不能加入
public void insertByOrder(Node element) {
Node temp=head;
boolean canInsert=true;
while(true) {
if(temp.next==null) {
break;
}else if(temp.next.no>element.no) {
break;
}else if(temp.next.no==element.no) {
canInsert=false;
break;
}
temp=temp.next;
}
if(canInsert) {
element.next=temp.next;
temp.next=element;
}
}
//删除指定位置的节点
public void deleteNode(int index) {
Node temp=head;
for(int i=1;i<index;i++) {
temp=temp.next;
}
temp.next=temp.next.next;
}
//返回链表中存有数据的节点
public int linkListLen() {
int len=0;
Node temp=head;
while(temp.next!=null) {
len++;
temp=temp.next;
}
return len;
}
//查找单链表的倒数第k个节点
public Node getLastByIndex(int index) {
int len=linkListLen();
Node temp=head;
if(temp.next==null) return null;
if(len<index||index<=0) return null;
for(int i=0;i<=len-index;i++) {
temp=temp.next;
}
return temp;
}
//递归实现单链表的反转
//参数:head为传入的头结点。
public void alertLinkList(Node head) {
if(head.next.next==null) {
this.head.next=head.next;
return;
}else {
head=head.next;
alertLinkList(head);
head.next.next=head;
head.next=null;
}
}
/*视频上的思路:
1.先定义一个反向链表的头结点
2.遍历原来的链表,每遍历一个,就将其放在链表的最前端
3.现在的头结点赋给原来的头结点。
*/
public Node reverseLinkList(Node head) {
SingleLinkList reverseLinkList=new SingleLinkList();
Node cur=head.next;
Node temp=null;//这个临时变量储存当前结点的下一个结点。
while(cur!=null) {
temp=cur.next;
cur.next=reverseLinkList.head.next;
reverseLinkList.head.next=cur;
cur=temp;
}
return reverseLinkList.head;
}
//从尾到头打印单链表
public void displayDecorder(Node cur) {
if(cur.next==null) {
//System.out.println(cur);
return;
}else {
cur=cur.next;
displayDecorder(cur);
System.out.println(cur+"倒序打印");
}
}
//有序单链表的合并,合并后的单链表是有序的
public SingleLinkList combineLinkList(SingleLinkList a,SingleLinkList b) {
//将b中的节点按照顺序加到a中
Node temp=b.head.next;
Node next=temp.next;
while(temp!=null) {
next=next.next;
a.insertByOrder(temp);
temp=next;
//System.out.println(temp+"ddd");
}
return a;
}
//遍历链表,打印
public void display() {
Node temp=head;
while(temp.next!=null) {
System.out.println(temp.next);
temp=temp.next;
}
}
}
//节点类
class Node{
public int no;
public String name;
public String zhijie;
Node next;
public Node(int no,String name,String zhijie) {
this.name=name;
this.no=no;
this.zhijie=zhijie;
}
//空构造表示头结点
public Node() {
// TODO 自动生成的构造函数存根
}
@Override
public String toString() {
return "Node [no=" + no + ", name=" + name + ", zhijie=" + zhijie + "]";
}
}
单链表(java实现)
最新推荐文章于 2023-09-21 22:30:14 发布
该博客主要围绕单链表展开,使用Java语言实现单链表。单链表是重要的数据结构,在信息技术领域有广泛应用,此实现有助于理解和运用单链表相关知识。
779

被折叠的 条评论
为什么被折叠?



