主要思想
单链表的缺点是:只能顺序遍历,当查找或修改某个节点时,有时候效率会很低,
因此,双向链表的出现,解决了这个问题。
代码实现
1.节点类
package DoubleLinkList;
public class NodesDouble {
public int id;
public String name;
public String NickName;
public NodesDouble pre;
public NodesDouble next;
public NodesDouble(int id, String name, String nickName) {
this.id = id;
this.name = name;
this.NickName = nickName;
}
@Override
public String toString() {
return "Nodes[" +
"id=" + id +
", name=" + name +
", NickName=" + NickName +
']';
}
}
2.双向链表
package DoubleLinkList;
public class NodesManage {
private NodesDouble head = new NodesDouble(0," "," ");
public NodesDouble getHead(){
return head;
}
public void AddNodes(NodesDouble nodesDouble){
NodesDouble temp = head;
boolean flag = false;
while (true){
if(temp.next == null){
break;
}
if(temp.next.id > nodesDouble.id){
break;
}else if(temp.next.id == nodesDouble.id){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.println("您要添加的节点已经存在,不能重复添加");
}else{
temp.next = nodesDouble;
nodesDouble.pre = temp;
}
}
public void Del(int id){
NodesDouble temp = head;
boolean flag = false;
while (true){
if(temp.next == null){
System.out.println("链表为空,不能删除节点!");
}
if(temp.id == id){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.pre.next = temp.next;
if(temp.next != null){
temp.next.pre = temp.pre;
}
}else{
System.out.printf("您要删除的节点id:%d不存在", id);
}
}
public void ModifyNodes(NodesDouble modifyNode){
NodesDouble temp = head;
boolean flag = false;
while (true){
if(temp == null){
break;
}
if(temp.id == modifyNode.id){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = modifyNode.name;
temp.NickName = modifyNode.NickName;
}else {
System.out.println("找不到您要修改的节点");
}
}
public void list(){
if(head.next == null){
System.out.println("链表为空,不能遍历");
return;
}
NodesDouble temp = head;
while (true){
System.out.println(temp);
if(temp.next == null){
break;
}
temp = temp.next;
}
return;
}
}
3.入口
package DoubleLinkList;
import SingleLinkList.ManageNodes;
import SingleLinkList.Nodes;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
NodesDouble n1 = new NodesDouble(1,"宋江","及时雨");
NodesDouble n2 = new NodesDouble(2,"武松","行者");
NodesDouble n3 = new NodesDouble(3,"李逵","黑旋风");
NodesDouble n4 = new NodesDouble(4,"张顺","浪里白条");
NodesManage obj = new NodesManage();
System.out.println("修改之前的链表:");
obj.AddNodes(n1);
obj.AddNodes(n2);
obj.AddNodes(n3);
obj.AddNodes(n4);
obj.list();
System.out.println("请输入您要修改的节点的Id:");
int Id = s.nextInt();
System.out.println("请输入您要修改的Id为" + Id + "的姓名:");
String names = s.next();
System.out.println("请输入您要修改的Id为" + Id + "的昵称:");
String nickNames = s.next();
NodesDouble newNodes = new NodesDouble(Id,names,nickNames);
obj.ModifyNodes(newNodes);
System.out.println("修改之后:");
obj.list();
System.out.print("请输入您要删除的节点的Id:");
int IdDel = s.nextInt();
obj.Del(IdDel);
System.out.println("删除之后:");
obj.list();
}
}