1、定义节点类、设置节点、遍历输出
class Node{ private String data; private Node next; public Node(String data){ this.data = data; } public String getData(){ return this.data; } public void setNext(Node next) { this.next = next; } public Node getNext(){ return this.next; } } public class LinkDemo1 { public static void main(String[] args) { Node root = new Node("火车头"); Node node1 = new Node("车厢1"); Node node2 = new Node("车厢2"); Node node3 = new Node("车厢3"); root.setNext(node1); node1.setNext(node2); node2.setNext(node3); print(root); } public static void print(Node node){ System.out.println(node.getData()); if(node.getNext()!=null){ print(node.getNext()); } } }
输出结果:
火车头
车厢1
车厢2
车厢3
2、基本操作:增加元素,打印元素,查询元素、删除元素,获取元素,修改元素,统计链表长度,判断是否为空。
class Link{ class Node{ private String data; private Node next; public Node (String data){ this.data = data; } public void add(Node newNode){ if(this.next==null){ this.next = newNode; }else { this.next.add(newNode); } } public void print(){ System.out.println(this.data); if (this.next!=null){ this.next.print(); } } public boolean isContains(String data){ if(data.equals(this.data)){ return true; }else { if(this.next!=null){ return this.next.isContains(data); }else { return false; } } } public void deleteNode(String data){ if(data.equals(this.data)){ if(this.next!=null){ root = this.next; }else { root=null; } }else { if(this.next!=null){ if(this.next.isContains(data)){ this.next = this.next.next; } }else { return; } } } public String getNode(int index){ if(Link.this.foot++ == index){ return this.data; }else { return this.next.getNode(index); } } public void modiNode(int index,String data){ if(index == Link.this.foot++){ this.data = data; }else { this.next.modiNode(index,data); } } } //===========以上为内部类定义========// private Node root; private int count = 0; private int foot = 0; public void addNewNode(String data){ Node newNode = new Node(data); if(this.root==null){ this.root = newNode; }else { this.root.add(newNode); } count++; } public void printNode(){ if (this.root!=null){ this.root.print(); } } public int getSize(){ return this.count; } public boolean isEmpty(){ return this.count == 0; } public boolean isContains(String data){ if (data == null || this.root==null){ return false; }else { return this.root.isContains(data); } } public void deleteNode(String data){ if(this.root.isContains(data)){ this.root.deleteNode(data); }else { return; } } public String getNode(int index){ foot = 0; if(index>this.count){ return null; }else { return this.root.getNode(index); } } public void modiNode(int index,String data){ if (index>this.count){ return; }else { this.root.modiNode(index,data); } } } public class LinkDemo2 { public static void main(String[] args) { Link link = new Link(); link.addNewNode("A"); link.addNewNode("B"); link.addNewNode("C"); link.addNewNode("B"); link.addNewNode("C"); link.printNode(); System.out.println("**********"); System.out.println("元素个数:"+link.getSize()); System.out.println("**********"); System.out.println("是否为空:"+link.isEmpty()); System.out.println("**********"); System.out.println("是否包含D:"+link.isContains("D")); System.out.println("**********"); link.deleteNode("B"); link.printNode(); System.out.println("**********"); link.modiNode(3,"D"); System.out.println(link.getNode(3)); } }
输出结果:
A B C B C ********** 元素个数:5 ********** 是否为空:false ********** 是否包含D:false ********** A C B C ********** D
3、链表变为对象数组内容取出
class Link{ class Node{ private String data; private Node next; public Node (String data){ this.data = data; } public void add(Node newNode){ if(this.next==null){ this.next = newNode; }else { this.next.add(newNode); } } public void print(){ System.out.println(this.data); if (this.next!=null){ this.next.print(); } } public boolean isContains(String data){ if(data.equals(this.data)){ return true; }else { if(this.next!=null){ return this.next.isContains(data); }else { return false; } } } public void deleteNode(String data){ if(data.equals(this.data)){ if(this.next!=null){ root = this.next; }else { root=null; } }else { if(this.next!=null){ if(this.next.isContains(data)){ this.next = this.next.next; } }else { return; } } } public String getNode(int index){ if(Link.this.foot++ == index){ return this.data; }else { return this.next.getNode(index); } } public void modiNode(int index,String data){ if(index == Link.this.foot++){ this.data = data; }else { this.next.modiNode(index,data); } } //第一次调用(Link),this=Link.root //第二次调用(Node),this=Link.root.next public void toArrayNode(){ Link.this.retArray[Link.this.foot++] = this.data; if(this.next!=null){ this.next.toArrayNode(); } } } //===========以上为内部类定义========// private Node root; private int count = 0; private int foot = 0; private String [] retArray; //返回的数组 public void addNewNode(String data){ Node newNode = new Node(data); if(this.root==null){ this.root = newNode; }else { this.root.add(newNode); } count++; } public void printNode(){ if (this.root!=null){ this.root.print(); } } public int getSize(){ return this.count; } public boolean isEmpty(){ return this.count == 0; } public boolean isContains(String data){ if (data == null || this.root==null){ return false; }else { return this.root.isContains(data); } } public void deleteNode(String data){ if(this.root.isContains(data)){ this.root.deleteNode(data); }else { return; } } public String getNode(int index){ foot = 0; if(index>this.count){ return null; }else { return this.root.getNode(index); } } public void modiNode(int index,String data){ if (index>this.count){ return; }else { this.root.modiNode(index,data); } } public String [] toArray(){ if(this.root == null){ return null; } this.foot = 0; //脚标控制 this.retArray = new String[this.count]; //根据保存内容开辟数组 this.root.toArrayNode(); return this.retArray; } } public class LinkDemo2 { public static void main(String[] args) { Link link = new Link(); link.addNewNode("A"); link.addNewNode("B"); link.addNewNode("C"); link.addNewNode("B"); link.addNewNode("C"); link.printNode(); System.out.println("**********"); System.out.println("元素个数:"+link.getSize()); System.out.println("**********"); System.out.println("是否为空:"+link.isEmpty()); System.out.println("**********"); System.out.println("是否包含D:"+link.isContains("D")); System.out.println("**********"); //link.deleteNode("B"); link.printNode(); System.out.println("**********"); link.modiNode(3,"D"); System.out.println(link.getNode(3)); System.out.println("**********"); for (String str : link.toArray()){ System.out.println(str); } } }
运行结果:
A B C B C ********** 元素个数:5 ********** 是否为空:false ********** 是否包含D:false ********** A B C B C ********** D ********** A B C D C
4、在链表中保存对象
class Pet{ private String name; private double price; public Pet(String name,double price){ this.name = name; this.price = price; } public String getInfo(){ return "name:"+this.name+",price:"+this.price; } public boolean compare(Pet pet){ if(this == pet){ return true; } if (pet == null){ return false; } if (this.name.equals(pet.name) && this.price == pet.price){ return true; } return false; } } class Link1{ class Node{ private Pet data; private Node next; public Node (Pet data){ this.data = data; } public void add(Node newNode){ if(this.next==null){ this.next = newNode; }else { this.next.add(newNode); } } public void print(){ System.out.println(this.data); if (this.next!=null){ this.next.print(); } } public boolean isContains(Pet data){ if(data.compare(this.data)){ return true; }else { if(this.next!=null){ return this.next.isContains(data); }else { return false; } } } public void deleteNode(Pet data){ if(data.compare(this.data)){ if(this.next!=null){ root = this.next; }else { root=null; } }else { if(this.next!=null){ if(this.next.isContains(data)){ this.next = this.next.next; } }else { return; } } } public Pet getNode(int index){ if(Link1.this.foot++ == index){ return this.data; }else { return this.next.getNode(index); } } public void modiNode(int index,Pet data){ if(index == Link1.this.foot++){ this.data = data; }else { this.next.modiNode(index,data); } } //第一次调用(Link),this=Link.root //第二次调用(Node),this=Link.root.next public void toArrayNode(){ Link1.this.retArray[Link1.this.foot++] = this.data; if(this.next!=null){ this.next.toArrayNode(); } } } //===========以上为内部类定义========// private Node root; private int count = 0; private int foot = 0; private Pet [] retArray; //返回的数组 public void addNewNode(Pet data){ Node newNode = new Node(data); if(this.root==null){ this.root = newNode; }else { this.root.add(newNode); } count++; } public void printNode(){ if (this.root!=null){ this.root.print(); } } public int getSize(){ return this.count; } public boolean isEmpty(){ return this.count == 0; } public boolean isContains(Pet data){ if (data == null || this.root==null){ return false; }else { return this.root.isContains(data); } } public void deleteNode(Pet data){ if(this.root.isContains(data)){ count--; //这一步是为了当删除元素之后,将链表变为对象数组输出,不会产生空指针报错。 this.root.deleteNode(data); }else { return; } } public Pet getNode(int index){ foot = 0; if(index>this.count){ return null; }else { return this.root.getNode(index); } } public void modiNode(int index,Pet data){ if (index>this.count){ return; }else { this.root.modiNode(index,data); } } public Pet [] toArray(){ if(this.root == null){ return null; } this.foot = 0; //脚标控制 this.retArray = new Pet[this.count]; //根据保存内容开辟数组 this.root.toArrayNode(); return this.retArray; } } public class LinkDemo3 { public static void main(String[] args) { Link1 link1 = new Link1(); link1.addNewNode(new Pet("cat",123)); link1.addNewNode(new Pet("dog",456)); link1.addNewNode(new Pet("pig",789)); System.out.println("是否為空:"+link1.isEmpty()); System.out.println("有幾個對象:"+link1.getSize()); System.out.println("是否包含dog:"+link1.isContains(new Pet("dog",456))); link1.deleteNode(new Pet("dog",456)); System.out.println("是否包含dog:"+link1.isContains(new Pet("dog",456))); link1.deleteNode(new Pet("d",456)); Pet [] pets = link1.toArray(); for(Pet pet : pets){ System.out.println(pet.getInfo()); } } }
运行结果:
是否為空:false 有幾個對象:3 是否包含dog:true 是否包含dog:false name:cat,price:123.0 name:pig,price:789.0
5、在关系中使用链表
class Province1{ private int pid; private String pname; private Link2 cities = new Link2(); public Link2 getCities(){ return this.cities; } public Province1(int pid,String pname){ this.pid=pid; this.pname=pname; } public String getInfo(){ return "省份编号"+this.pid+"省份名称"+this.pname; } public boolean compare(Province1 province){ if (this == province){ return true; } if (province == null){ return false; } if(this.pid == province.pid && this.pname.equals(province.pname)){ return true; } return false; } } class City{ private int cid; private String cname; private Province1 province; public void setProvince(Province1 province){ this.province = province; } public Province1 getProvince(){ return this.province; } public City(int cid,String cname){ this.cid=cid; this.cname=cname; } public String getInfo(){ return "城市编号:"+this.cid+",城市名称:"+this.cname; } public boolean compare(City city){ if(this == city){ return true; } if (city == null){ return false; } if (this.cid==city.cid && this.cname.equals(city.cname)){ return true; } return false; } } class Link2{ class Node{ private City data; private Node next; public Node (City city){ this.data = city; } public void add(Node newNode){ if(this.next==null){ this.next = newNode; }else { this.next.add(newNode); } } public void print(){ System.out.println(this.data); if (this.next!=null){ this.next.print(); } } public boolean isContains(City data){ if(data.compare(this.data)){ return true; }else { if(this.next!=null){ return this.next.isContains(data); }else { return false; } } } public void deleteNode(City data){ if(data.compare(this.data)){ if(this.next!=null){ root = this.next; }else { root=null; } }else { if(this.next!=null){ if(this.next.isContains(data)){ this.next = this.next.next; } }else { return; } } } public City getNode(int index){ if(Link2.this.foot++ == index){ return this.data; }else { return this.next.getNode(index); } } public void modiNode(int index,City data){ if(index == Link2.this.foot++){ this.data = data; }else { this.next.modiNode(index,data); } } //第一次调用(Link),this=Link.root //第二次调用(Node),this=Link.root.next public void toArrayNode(){ Link2.this.retArray[Link2.this.foot++] = this.data; if(this.next!=null){ this.next.toArrayNode(); } } } //===========以上为内部类定义========// private Node root; private int count = 0; private int foot = 0; private City [] retArray; //返回的数组 public void addNewNode(City data){ Node newNode = new Node(data); if(this.root==null){ this.root = newNode; }else { this.root.add(newNode); } count++; } public void printNode(){ if (this.root!=null){ this.root.print(); } } public int getSize(){ return this.count; } public boolean isEmpty(){ return this.count == 0; } public boolean isContains(City data){ if (data == null || this.root==null){ return false; }else { return this.root.isContains(data); } } public void deleteNode(City data){ if(this.root.isContains(data)){ count--; this.root.deleteNode(data); }else { return; } } public City getNode(int index){ foot = 0; if(index>this.count){ return null; }else { return this.root.getNode(index); } } public void modiNode(int index,City data){ if (index>this.count){ return; }else { this.root.modiNode(index,data); } } public City [] toArray(){ if(this.root == null){ return null; } this.foot = 0; //脚标控制 this.retArray = new City[this.count]; //根据保存内容开辟数组 this.root.toArrayNode(); return this.retArray; } } public class LinkDemo4 { public static void main(String[] args) { //Link2 link1 = new Link2(); //准备对象 Province1 province1 = new Province1(1,"jiangsu"); City city1 = new City(1,"yangzhou"); City city2 = new City(2,"yancheng"); City city3 = new City(3,"huaian"); //设置关系 city1.setProvince(province1); city2.setProvince(province1); city3.setProvince(province1); province1.getCities().addNewNode(city1); province1.getCities().addNewNode(city2); province1.getCities().addNewNode(city3); //第二步:取出关系 System.out.println(province1.getInfo()); System.out.println("包含的城市数量:"+province1.getCities().getSize()); City [] city = province1.getCities().toArray(); System.out.println("删除前的城市信息:"); for (int x = 0 ; x<city.length;x++){ System.out.println(city[x].getInfo()); } System.out.println("是否包含yancheng:"+province1.getCities().isContains(new City(2,"yancheng"))); System.out.println("删除yancheng:"); province1.getCities().deleteNode(new City(2,"yancheng")); City [] c = province1.getCities().toArray(); for (City x:c){ System.out.println(x.getInfo()); } } }
运行结果:
省份编号1省份名称jiangsu 包含的城市数量:3 删除前的城市信息: 城市编号:1,城市名称:yangzhou 城市编号:2,城市名称:yancheng 城市编号:3,城市名称:huaian 是否包含yancheng:true 删除yancheng: 城市编号:1,城市名称:yangzhou 城市编号:3,城市名称:huaian
原文:https://www.cnblogs.com/cathycheng/p/13150003.html