java实现单链表、双向链表

作者:New_Null 时间:2023-02-09 03:15:59 

本文实例为大家分享了java实现单链表、双向链表的相关代码,供大家参考,具体内容如下

java实现单链表:


package code;

class Node
{
Node next;
int data;
public Node(int data)
{
this.data=data;
}

}
class LinkList
{
Node first;
//头部
public LinkList()
{
this.first=null;
}
public void addNode(Node no)
{
no.next=first;
first=no;//在头部添加
}
public void delectNode()
{
Node n=first.next;
first=null;
first=n;//在头部删除
}
//删除指定位置
public int Number()
{
int count=1;
//查看有多少元素
Node nd=first;
while(nd.next!=null)
{
 nd=nd.next;
 count++;
}
return count;
}
public void delectExact(int n)
{
//删除指定位置
if(n>1)
{
 int count=1;
 Node de=first;
 while(count<n-1)
 {
 de=de.next;
 count++;

}
 de.next=de.next.next;
}
else
 first=first.next;

}
public void addExact(int n,Node nd)
{
if(n>1)//添加指定位置
{
 int count=1;
 Node de=first;
 while(count<n-1)
 {
 de=de.next;
 count++;

}
 nd.next=de.next;
 de.next=nd;

}
else
 first=first.next;
}
public int findNode(int n)
{
int count=1;//查找一个数对应的位置
Node de=first;
while(de.data!=n)
{
 de=de.next;
 count++;
 if(de==null)
 {
 return -1;
 }
}
return count;
}
public void print()
{
Node no=first;//打印所有
while(no!=null)
{
 System.out.println(no.data);
 no=no.next;
}
}
}
public class TextNode
{
public static void main(String[] args)
{
LinkList ll=new LinkList();
ll.addNode(new Node(12));
ll.addNode(new Node(15));
ll.addNode(new Node(18));
ll.addNode(new Node(19));
ll.addNode(new Node(20));
/*System.out.println(ll.first.data);

ll.delectNode();
System.out.println(ll.first.data);*/
System.out.println(ll.Number());
ll.delectExact(3);
ll.addExact(3, new Node(100));
System.out.println(ll.Number());
// ll.print();
System.out.println(ll.findNode(112));

}
}

java实现双向链表:


public class DoubleLink
{
public static void main(String[]args)
{
Node2 no=new Node2(5);
no.addLeft(new Node2(6));
no.addRight(new Node2(7));
/*no.print();
no.print2();*/
no.addExact2(1, new Node2(8));
no.print();
System.out.println("--------------");
no.print2();
}
}
class Node2
{
public Node2 first;
public Node2 end;
public Node2 left;
public Node2 right;
int data=0;
public Node2(int n)
{

first=this;
end=this;

first.data=n;
}
//从头部添加
public void addLeft(Node2 before)
{
first.left=before;
before.right=first;
first=before;
}
//从尾部添加
public void addRight(Node2 after)
{
end.right=after;
after.left=end;
end=after;
}
//插入正数(第三声)的第几个
public void addExact(int n,Node2 no)
{
int count=0;
if(n==0)
{
 addLeft(no);
}
else
{
 Node2 f=first;
 while(true)
 {
 f=f.right;
 count++;
 if(count==n)
 {
  //此处为四个指针的指向的变化
  no.left=f.left;
  f.left.right=no;
//  first.left=no;
  no.right=f;
  f.left=no;
  break;
 }

}
}
}
//插入倒数的第几个
public void addExact2(int n,Node2 no)
{
int count=0;
if(n==0)
{
 addRight(no);
}
else
{
 Node2 f=end;
 while(true)
 {
 f=f.left;
 count++;
 if(count==n)
 {

no.left=f;
  no.right=f.right;
  f.right.left=no;
  f.right=no;
  break;

}
 }
}
}
//正序遍历
public void print()
{
System.out.println(first.data);
while(first.right!=null)
{
 System.out.println(first.right.data);
 first=first.right;
}
// System.out.println(end.data);
}
//倒序遍历
public void print2()
{
System.out.println(end.data);
while(end.left!=null)
{
 System.out.println(end.left.data);
 end=end.left;
}
}

}
/*值得注意的是,每一次插入一个新的对象的时候,需要注意指针指向的改变。
首先是这个新的对象两边的指向(左和右),其次是时左边的对象向右的指向
和右边对象向左的指向。
这四个指针的指向必须正确,否则可能导致正序或者倒序遍历无法实现。
*/
/*对比单链表,单链表只能从一个方向遍历,因为只有一个头,而双向链表,有头和尾,可以从
* 头遍历,也可以从尾遍历,而且其中一个对象因为有两个方向的指针,所以他可以获得左边的
* 对象也可以获得右边的对象。
* 但是单链表的话,因为只有一个方向,所以只能向左或右。添加对象的时候,双向也可以从头添加,也可以从尾添加。
* 如果单链表要实现两个方向添加比较难得,或者说不行,因为他只有向左或向右的一个方向的指针
* 而双向链表每个对象都有两个方向的指针没这样更灵活,但是这同样有缺点,因为这样的话每个对象
* 都会包含两个指针,这同样内存会消耗更多。
*
* */
标签:java,单链表,双向链表
0
投稿

猜你喜欢

  • Java看完秒懂版熔断和降级的关系

    2023-11-06 01:12:13
  • JAVA调用SAP WEBSERVICE服务实现流程图解

    2023-11-07 03:54:57
  • Java实现最小生成树算法详解

    2023-11-25 04:51:22
  • Java如何使用HTTPclient访问url获得数据

    2023-11-12 04:16:21
  • Spring实战之SpEl语法实例详解

    2023-09-18 07:56:03
  • Java文件操作之IO流 File类的使用详解

    2023-07-26 00:49:41
  • Android Studio多渠道打包的配置方法

    2023-06-15 23:19:48
  • JAVA如何定义构造函数过程解析

    2023-11-04 08:15:09
  • Android编程实现WebView添加进度条的方法

    2023-07-06 03:16:46
  • java实现人员信息管理系统

    2023-11-02 05:21:31
  • Android Rxjava3 使用场景详解

    2023-08-06 08:58:50
  • Java原生服务器接收上传文件 不使用MultipartFile类

    2023-11-09 19:31:36
  • java开发工作中对InheritableThreadLocal使用思考

    2023-11-24 21:46:44
  • 详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    2023-08-22 23:47:37
  • 浅谈java中Math.random()与java.util.random()的区别

    2023-11-26 16:37:16
  • Spring Security OAuth2 实现登录互踢的示例代码

    2023-09-04 19:09:28
  • JAVA 实现磁盘文件加解密操作的示例代码

    2023-11-15 00:13:06
  • Mac OS下为Android Studio编译FFmpeg解码库的详细教程

    2023-06-30 02:37:54
  • Spring Cloud 的 Hystrix.功能及实践详解

    2023-11-19 06:40:46
  • Java import导入及访问控制权限修饰符原理解析

    2023-08-17 21:42:59
  • asp之家 软件编程 m.aspxhome.com