大家学习数据结构时候使用的语言大多数都是c语言版本,那么java是如何操作数据结构中的链表的呢?其实思路与C语言指针操作链表大差不差,只不过java中没有指针,而是使用类的引用实现相关操作。
目录
一、创建节点类型
创建链表的第一步当然是要首先定义好节点的单链表的类型啦
C语言中使用结构体指针变量作为单链表的类型,那么我们java中应该如何表示一个节点呢?
没错,就是使用一个类来作为节点对象。
public class Node {
private int data; //节点存储的数据
private Node next; //存储下一个节点的引用
public Node(int data) //带参构造
{
this.data=data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Node next)
{
this.next=next;
}
public Node(){} //无参构造
public int getData(){
return this.data;
}
}
这里我们定义了一个java类来作为单链表节点,可以看到,该节点用于存放int类型数据,并通过Node类型变量next来指向下一个节点。
二、在链表中插入新节点
public static void insertNode(Node nodeList,int p,int data) //在数据为p的节点前面插入
//数据为data的新节点
{
Node insetNode = new Node (data); //将数据封装成节点
//倘若直接使用头结点,则操作完成后,头结点的指向已经改变,这不合理
Node node=nodeList;
while(node!=null)
{
int a=node.getNext().getData();
if(a==p) //寻找数据为p的前驱节点
{
insetNode.setNext(node.getNext());
node.setNext(insetNode);
break;
}else{
System.out.println("数据:"+node.getData());
node=node.getNext();
}
}
}
三、删除元素为p的链表节点
public static void deleteNode(Node nodeList,int p) //删除数据为p的节点
{
Node node=nodeList;
while(node.getNext()!=null)
{
if(node.getNext().getData()==p) //找到前驱节点
{
node.setNext(node.getNext().getNext());
break;
}
node=node.getNext();
}
}
四、删除节点p
public static void deleteNodeByid(Node nodeList,Node p)
{
Node node = nodeList;
while(node!=null&&node.getNext()!=p)
{
node=node.getNext();
}
if(node==null) System.out.println("你给的节点查询不到");
else{
node.setNext(node.getNext().getNext());
}
}
public static Node createNode(Node nodeList,int data) //返回链表中数据为data的第一个节
//点
{
Node node = nodeList;
while(node!=null&&node.getData()!=data)
node = node.getNext();
if(node==null) return null;
else return node;
}
五、删除元素p及其后边的所有节点
public static void deleteNumNode(Node nodeList,int p)
{
Node node=nodeList;
while(node.getNext()!=null&&node.getData()!=p)
{
node=node.getNext();
}if(node.getNext()==null) System.out.println("请输入正确的数据");
while(node!=null)
{
deleteNodeByid(nodeList,node);
node=node.getNext();
}
}
public static void deleteNodeByid(Node nodeList,Node p)
{
Node node = nodeList;
while(node!=null&&node.getNext()!=p)
{
node=node.getNext();
}
if(node==null) System.out.println("你给的节点查询不到");
else{
node.setNext(node.getNext().getNext());
}
}
六、将单链表构建成循环单链表
这一个实现很简单,只需要将头结点的引用传递给尾结点的next即可
public static void CircleNode(Node nodeLsit) //使单链表连接成循环链表
{
Node node=nodeLsit;
while(node.getNext()!=null)
node=node.getNext();
node.setNext(nodeLsit);
}