双列表
1.如何在Java中定义一个节点
可以这样做:
public class Node {
public int no ;//可以自己定义该节点的相关1属性
public Node nextNode;//指向下一个节点
public Node preNode;//指向前一个节点
public Node(int no){
this.nextNode =null;
this.preNode =null;
this.no =no;
}
注意事项:
头节点不能动private Node hedaNode = new Node(999999999);
我们后面的操作都是依靠一个扫描节点Node scan =headNode;
来帮助我们完成
2.添加节点到列表中
public void addNode(Node node){
Node scan = hedaNode;
for ( ; scan.nextNode != null ;scan= scan.nextNode );
scan.nextNode =node;
node.preNode =scan;
}
3.双列表的添加节点
该图为双列表的头插法插入节点 插入的节点的数据只有一个:no =100
代码实现为:
public void insertFirst(){
Scanner sc= new Scanner(System.in);
int nums =sc.nextInt();
Node node = new Node(nums);//new 一个需要添加的节点
Node scan =hedaNode;//定义一个指向头节点的节点,因为头节点不能动
Node cur =hedaNode.nextNode;//定义一个指向头节点下一个节点的节点
if (cur == null){
scan.nextNode =node;
node.preNode =scan;
}else {
node.nextNode=cur;
cur.preNode =node;
node.preNode=scan;
scan.nextNode =node;
}
}
4.获取列表长度
依然是定义一个辅助节点Node scan 来扫描 直到sacn.next == null
就可以得到列表长度
代码实现
public int getListSize(){
int size = 0 ;
for (Node scan = hedaNode; scan.nextNode != null ; scan =scan.nextNode){
size++;
}
return size;
}
5.删除指定的第K个节点 依然还是定义一个辅助节点 Node scan =hedaNode;
并利用for循环来扫描全部节点
- 当第K个节点不存在的时候,直接
return
并提示该节点不存在 - 删除最后一个节点,即当扫描结束时
scan.nextNode == null
, scan.preNode.nextNode =null; scan.preNode =null;
- 删除中间节点
scan.preNode.nextNode = scan.nextNode; scan.nextNode.preNode = scan.nextNode; scan.nextNode = null; scan.preNode = null;
public void deleteNode(int k){
Node scan =hedaNode;
for (int i = 1 ; i <= k; scan =scan.nextNode,i++ );
if (scan ==null){
System.out.println("该节点不存在!");
return;
}else if(scan.nextNode == null){
scan.preNode.nextNode =null;
scan.preNode =null;
}else {
scan.preNode.nextNode = scan.nextNode;
scan.nextNode.preNode = scan.nextNode;
scan.nextNode = null;
scan.preNode = null;
}
}
6.遍历节点:
当所有操作做完后我们需要查看一下自己的列表,所以我们需要对我们的列表进行遍历
public void showDoubleList(){
for (Node scan = hedaNode.nextNode ; scan != null ; scan = scan.nextNode ){
System.out.println(scan.no);
}
}