1. 链表的基本形式
private String data;//要保存的数据
private Node next;//要保存的下一个节点
//每一个Node类对象都必须保存有相应的数据
public Node(String data){
this.data =data;
}
public void setNext(Node next){
this.next =next;
}
public Node getNext(){
return this.next;
}
public String getData(){
return this.data;
}
}
以上只是一个专门保存节点关系的类,但是怎么保存关系,并不是Node类执行。
范例:使用第一种形式设置和取出数据
public class LinkDemo{
public static void main(String args[]){
//第一步:准备出所有数据
Node root = new Node("火车头");
Node n1 = new Node("车厢A");
Node n2 = new Node("车厢B");
root.setNext(n1);
n1.setNext(n2);
//第二步:取出所有数据
Node currentNode = root;//当前从根节点开始读取
while (currentNode != null){
System.out.println(currentNode.getData());
将下一个节点设置为当前节点
currentNode = currentNode.getNext();
}
}
}
实际上以上操作使用的循环并不方便,最好还是应该使用递归操作完成,递归更加直白。
范例:使用第二种形式设置和取出数据
public class LinkDemo{
public static void main(String args[]){
//第一步:准备出所有数据
Node root = new Node("火车头");
Node n1 = new Node("车厢A");
Node n2 = new Node("车厢B");
root.setNext(n1);
n1.setNext(n2);
print(root);
}
public static void print(Node current){
if (current == null){//递归结束条件
return ;//结束方法
}
System.out.println(current.getData());
print(current.getNext());
}
}
疑问? 整个过程完成的功能就是一个设置数据和取数据的过程,为什么需要Node呢?
由于数据本身不具备先后的关系,所以使用Node类来封装数据,同时利用Node类来指向下一个节点。
2.链表的基本雏形
通过分析发现:用户在操作的过程中完全没有必要去关心Node类是否存在;所有的节点的引用关心不应该由用户处理,应该有一个专门的工具类去处理。
下面需要定义一个Link类,来帮助客户端去隐藏所有的链表中给出的细节操作。
class Node {
private String data;//要保存的数据
private Node next;//要保存的下一个节点
//每一个Node类对象都必须保存有相应的数据
public Node(String data){
this.data =data;
}
public void setNext(Node next){
this.next =next;
}
public Node getNext(){
return this.next;
}
public String getData(){
return this.data;
}
//实现节点的添加
//第一次调用(Link):this = Link.root
//第二次调用(Node): this = Link.root.next
//第三次调用(Node): this = Link.root.next.next
public void addNode(Node newNode){
if(this.next==null){
this.next = newNode;//保存新节点
}else{//当前节点之后还存在有节点
//当前节点的下一个节点继续保存
this.next.addNode(newNode);//
}
}
// 第一次调用(Link): this = Link.root
// 第二次调用(Node):this = Link.root.next
//第三次调用(Node): this = Link.root.next.next
public void printNode(){
System.out.println(this.data);//输出当前节点的数据
if(this.next != null){ //现在还有下一个节点
this.next.printNode();//输出下一个
}
}
}
class Link{//负责Node类对象的关系处理
private Node root;//根节点
public void add(String data){ //增加数据
//为了设置数据的先后关系,所以将data包装在Node类中
Node newNode = new Node(data);
if(this.root == null){
this.root = newNode;
}else{//根节点已经存在了
//随后后面增加的元素应该交由节点来决定
this.root.addNode(newNode);
}
}
public void print(){//输出数据
if (this.root != null){//现在存在根节点
this.root.printNode();//交给Node类输出
}
}
}
public class LinkDemo{
public static void main(String args[]){
link link = new Link();
link.add("Hello");
link.add("World");
link.add("Welcome");
link.add("You");
link.print();//展示数据
}
}
通过以上的代码,可以发现链表的基本操作特点:
a. 客户端不用去关注具体的Node以及引用关系的细节,只关注提供数据和取出数据;
b. Link类的主要功能是控制Node类对象的产生和根节点;
c. Node类主要负责数据的保存以及引用关系的分配。
链表是一种最为简单的数据结构,它的主要目的是依靠引用关系来实现多个数据的保存。
链表由一个个节点组成,下面我们来定义一个节点类
class Node {private String data;//要保存的数据
private Node next;//要保存的下一个节点
//每一个Node类对象都必须保存有相应的数据
public Node(String data){
this.data =data;
}
public void setNext(Node next){
this.next =next;
}
public Node getNext(){
return this.next;
}
public String getData(){
return this.data;
}
}
以上只是一个专门保存节点关系的类,但是怎么保存关系,并不是Node类执行。
范例:使用第一种形式设置和取出数据
public class LinkDemo{
public static void main(String args[]){
//第一步:准备出所有数据
Node root = new Node("火车头");
Node n1 = new Node("车厢A");
Node n2 = new Node("车厢B");
root.setNext(n1);
n1.setNext(n2);
//第二步:取出所有数据
Node currentNode = root;//当前从根节点开始读取
while (currentNode != null){
System.out.println(currentNode.getData());
将下一个节点设置为当前节点
currentNode = currentNode.getNext();
}
}
}
实际上以上操作使用的循环并不方便,最好还是应该使用递归操作完成,递归更加直白。
范例:使用第二种形式设置和取出数据
public class LinkDemo{
public static void main(String args[]){
//第一步:准备出所有数据
Node root = new Node("火车头");
Node n1 = new Node("车厢A");
Node n2 = new Node("车厢B");
root.setNext(n1);
n1.setNext(n2);
print(root);
}
public static void print(Node current){
if (current == null){//递归结束条件
return ;//结束方法
}
System.out.println(current.getData());
print(current.getNext());
}
}
疑问? 整个过程完成的功能就是一个设置数据和取数据的过程,为什么需要Node呢?
由于数据本身不具备先后的关系,所以使用Node类来封装数据,同时利用Node类来指向下一个节点。
2.链表的基本雏形
通过分析发现:用户在操作的过程中完全没有必要去关心Node类是否存在;所有的节点的引用关心不应该由用户处理,应该有一个专门的工具类去处理。
下面需要定义一个Link类,来帮助客户端去隐藏所有的链表中给出的细节操作。
class Node {
private String data;//要保存的数据
private Node next;//要保存的下一个节点
//每一个Node类对象都必须保存有相应的数据
public Node(String data){
this.data =data;
}
public void setNext(Node next){
this.next =next;
}
public Node getNext(){
return this.next;
}
public String getData(){
return this.data;
}
//实现节点的添加
//第一次调用(Link):this = Link.root
//第二次调用(Node): this = Link.root.next
//第三次调用(Node): this = Link.root.next.next
public void addNode(Node newNode){
if(this.next==null){
this.next = newNode;//保存新节点
}else{//当前节点之后还存在有节点
//当前节点的下一个节点继续保存
this.next.addNode(newNode);//
}
}
// 第一次调用(Link): this = Link.root
// 第二次调用(Node):this = Link.root.next
//第三次调用(Node): this = Link.root.next.next
public void printNode(){
System.out.println(this.data);//输出当前节点的数据
if(this.next != null){ //现在还有下一个节点
this.next.printNode();//输出下一个
}
}
}
class Link{//负责Node类对象的关系处理
private Node root;//根节点
public void add(String data){ //增加数据
//为了设置数据的先后关系,所以将data包装在Node类中
Node newNode = new Node(data);
if(this.root == null){
this.root = newNode;
}else{//根节点已经存在了
//随后后面增加的元素应该交由节点来决定
this.root.addNode(newNode);
}
}
public void print(){//输出数据
if (this.root != null){//现在存在根节点
this.root.printNode();//交给Node类输出
}
}
}
public class LinkDemo{
public static void main(String args[]){
link link = new Link();
link.add("Hello");
link.add("World");
link.add("Welcome");
link.add("You");
link.print();//展示数据
}
}
通过以上的代码,可以发现链表的基本操作特点:
a. 客户端不用去关注具体的Node以及引用关系的细节,只关注提供数据和取出数据;
b. Link类的主要功能是控制Node类对象的产生和根节点;
c. Node类主要负责数据的保存以及引用关系的分配。