public class 链表{
public static void main(String[] args){
NodeManager nm = new NodeManager();
System.out.println("---------------add---------------");
nm.add(5);
nm.add(4);
nm.add(3);
nm.add(2);
nm.add(1);
nm.add(0);
nm.print();
System.out.println("--------------del----------------");
nm.del(3);
nm.print();
System.out.println("--------------find----------------");
System.out.println(nm.find(3));
System.out.println("--------------update----------------");
nm.update(2,250);
nm.print();
System.out.println("--------------insert----------------");
nm.insert(4,20);
nm.print();
System.out.println(nm.len);
}
}
class NodeManager{
private Node root;//根节点
private int currentIndex = -1;//节点序号,每次操作从-1开始
public int len = -1;
//因为外部无法访问内部类,所以需要提供访问内部类方法
public void add(int data){
if(root == null){
len++;
root = new Node(data);
}else{
root.addNode(data);
}
}
public void del(int data){
if(root==null){
return;
}
if(root.getData()==data){
root = root.next;//根节点后移
len--;
}else{
root.delNode(data);
}
}
public void print(){
if(root!=null){
System.out.print("root:"+root.getData()+"->");
root.printNode();
System.out.println("打印完毕");
}
}
//查找是否存在节点
public boolean find(int data){
if(root==null) return false;
if(root.getData()==data)
return true;
else{
root.findNode(data);
}
return false;
}
public boolean update(int oldData,int newData){
if(root== null){
return false;
}
if(root.getData()==oldData){
root.setData(newData);
return true;
}else{
root.updateNode(oldData,newData);
return false;
}
}
public void insert(int index,int data){
currentIndex = -1;
if(index<=len){
if(root==null){
return;
}
if(inde x<0){
return;
}
if(index == currentIndex){
len++;
Node newNode = new Node(data);
newNode.next = root;
root = newNode;
}else{
root.insertData(index,data);
}
}
else{
System.out.println("请输入正确的长度");
}
}
private class Node{
private int data;
private Node next;//把当前类型作为属性
public Node(int data){
this.data = data;
}
public void setData(int data){
this.data = data;
}
public int getData(){//给外部类用的
return data;
}
//添加节点
public void addNode(int data){
if(this.next ==null)
{
len++;
this.next = new Node(data);
}else{
this.next.addNode(data);//this是root
}
}
//删除节点
public void delNode(int data){
if(this.next!=null){
if(this.next.data!=data){
this.next.delNode(data);
}else{
this.next = this.next.next;
len--;
}
}
}
//输出所有节点
public void printNode(){
if(this.next!=null)
{
System.out.print(this.next.data+"->");//此处不用getData(),是因为getData是给外部用,而内部可以直接用data
this.next.printNode();
}
}
//查找节点是否存在
public boolean findNode(int data){
if(this.next == null){
return false;
}
if(this.next.data==data){
return true;
}else{
this.next.findNode(data);
}
return false;
}
//修改节点
public boolean updateNode(int oldData,int newData){
if(this.next==null){
return false;
}
if(this.next.data==oldData){
this.next.data =newData;
return true;
}else{
this.next.updateNode(oldData,newData);
return false;
}
}
//插入节点
public void insertData(int index,int data){
currentIndex++;
if(index == currentIndex){
len++;
Node newNode = new Node(data);
if(index<len){
newNode.next = this.next;
this.next = newNode;
}else{
newNode.next=null;
this.next = newNode;
}
}else{
this.next.insertData(index,data);//谁调用inserData方法那么this就是谁
}
}
}
}