简单实现链表增删改查

学习目标:

  • 简单实现链表增删改查

学习内容:

  1. 外部类和内部类
  2. 封装方法
  3. 其他类使用内部类私有方法
  4. 递归算法

代码块:

class test{
  public static void main(String[] args){
    Nodelianbiao nlb = new Nodelianbiao();
        nlb.add(10);
        nlb.add(9);
        nlb.add(8);
        nlb.add(7);		//添加数据
        nlb.print();	//输出所有数据
        nlb.del(9);		//删除元素为9的数据
        nlb.print();	
        System.out.println(nlb.find(11));	//查询元素是否存在
        nlb.update(7,8);	//修改元素(7改成8)
        nlb.print();		
        nlb.insert(3,11);	//插入元素(在小标为3的位置插入元素为11的数据)
        nlb.print();
  }
}

class Nodelianbiao{
    private Node root;      //根节点
    private int countindex = 0;
    public void add(int data){
        if(root == null){
            root = new Node(data);
            countindex++;
        }else{
            root.addNode(data);
        }
    }
    public void del(int data){
        if(root.getData() == data){
            root = root.next;
            countindex--;
        }else{
            root.delNode(data);
        }
    }
    public void print(){
        if(root!=null){
            System.out.print(root.data+"=>");
            root.printNode();
            System.out.println();
        }
    }
    public boolean find(int data){
        if (root.getData() == data) return true;
        else{
            if (root.findNode(data)) return true;
        }
        return false;
    }
    public void update(int olddata,int newdata){
        if(find(olddata)){
            if(root.getData() == olddata){
                root.setData(newdata);
            }
            else{
                root.updateNode(olddata,newdata);
            }
        }
        else{
            System.out.println("无此数据");
        }
    }
    public void insert(int index,int data){
        if(this.countindex>=index){
            int temp = 0;
            if(index == 0){
                Node root1 = new Node(data);
                root1.next = root;
                root = root1;
            }
            else{
                temp++;
                root.insertNode(index,data,temp);
            }
        }
    }

    private class Node{
        private int data;
        private Node next;

        private Node(int data){
            this.data = data;
        }
        private void setData(int data){
            this.data = data;
        }
        private int getData(){
            return data;
        }
        //添加节点
        private void addNode(int data){
            if(this.next == null){
                this.next = new Node(data);
                countindex++;
            }else{
                this.next.addNode(data);
            }
        }
        //删除节点
        private void delNode(int data){
            if(this.next!=null){
                if(this.next.data == data){
                    this.next = this.next.next;
                    countindex--;
                }
                else{
                    this.next.delNode(data);
                }
            }
        }
        //输出所有节点
        private void printNode(){
            if(this.next!=null){
                System.out.print(this.next.data+"=>");
                this.next.printNode();
            }
        }
        //查找节点是否存在
        private boolean findNode(int data){
            if (this.next!=null) {
                if (this.next.data == data) return true;
                else if (this.next.findNode(data)) return true;
            }
            return false;
        }
        //修改节点
        private void updateNode(int olddata,int newdata){
            if(this.next.data == olddata){
                this.next.setData(newdata);
            }
            else{
                this.next.updateNode(olddata,newdata);
            }
        }
        //插入节点
        private void insertNode(int index,int data,int temp){
            if(index == temp){
                Node count = new Node(data);
                count.next = this.next;
                next = count;
            }else{
                temp++;
                this.next.insertNode(index,data,temp);
            }
        }
    }
}

代码解析:

编写外部类和内部类

首先我们编写一个外部类叫Nodewaibulei

class Nodewaibulei{

}

在外部类中再编写一个私有的内部类叫Node

class Nodewaibulei{
	private class Node{
	
	}
}

在内部类定义一个私有的int类型数据data
再定义一个私有的内部类类型的数据next
给内部类定义构造方法
给data编写get,set方法

private class Node{
	private int data;
	private Node next;
	
	private Node(int data){
		this.data = data;
	}
	private void setData(int data){
		this.data = data;
	}
	private int getData(){
		return data;
	}
}

在内部类再编写六个方法,分别是:
addNode() \t添加
delNode() 删除
findNode() 查
printNode() 输出所有
updateNode() 修改
insertNode() 插入

private class Node{
	private int data;
	private Node next;

	private void setData(int data){
		this.data = data;
	}
	private int getData(){
		return data;
	}
	private void addNode(int data){		//添加数据

	}
	private void delNode(int data){			//删除数据
	
	}
	private boolean findNode(int date){		//查询数据(返回boolean)
		return false;
	}
	private void printNode(){		//输出所有数据
	
	}
	private void updateNode(int olddate,int newdata){		//修改数据,olddata为原数据,newdata新数据

	}
	private void insertNode(int index,int data){	//插入数据,index插入索引位置

	}
}

内部类私有方法虽然外部类可以使用,但其他类中无法调用,所以在外部类中编写共有的方法
外部类中:

class Nodewaibulei{
	public void add(int data){

	}
	public void del(int data){

	}
	public boolean find(int data){
		return false;
	}
	public void print(){

	}
	public void update(int olddate,int newdata){

	}
	public void insert(int index,int data){

	}
}

在外部类中定义内部类类型的数据,这也叫根节点。

class Nodewaibulei{
	private Node root;
}

添加数据

咱们回到main方法中
先创建一个Nodewaibulei类
再用add方法添加一个数据

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	
}

此时add方法接收到一个参数,我们要判断链表根节点是否为null,

  1. 如果是,创建根节点并把参数直接赋给根节点
  2. 如果否,调用内部类中的addNode()方法
public void add(int data){
	if(root == null){
		root = new Node(data);
	}else{
		root.addNode(data);
	}
}
		咱们回到内部类中的addNode()方法中,

判断内部类中的next是否为空

  • 如果是,新建一个内部类,data数据赋给新类,并把新类赋给next
  • 如果否,调用next中的addNode()方法,并把参数递过去。
private void addNode(int data){
    if(this.next == null){
        this.next = new Node(data);
    }else{
        this.next.addNode(data);
    }
}

这里有点绕,next本身就是一个内部类类型的数据,每次创建一个新的内部类时,它都会定义一个空的内部类对象next。也就是说每添加一个数据,就会多出一个空的next,为下一次添加新值准备。

比如咱们添加第一个数据时,在外部类中给内部类类型的root 创建一个新的内部类,

public void add(int data){
	if(root == null){
		root = new Node(data);
	}else{
		root.addNode(data);
	}
}

因为是第一个数据,所以root为空,当我们给root创建新的内部类时,内部类就定义了两个参数,一个是int类型的数据data,另一个是内部类类型的next。
data是有构造方法,定义类时就得提供参数,而next就不需要,所以定义一个新的内部类,就得空出一个next;
那什么时候用next?就是又要新添加数据时,new一个新的内部类,并把它赋给next。当然了,new出来的内部类又会空出一个next;

	回过头来看一下内部类中的add方法,

判断next是否为空:

  • 如果是,新建一个内部类,data数据赋给新类,并把新类赋给next
  • 如果否,调用next中的addNode()方法,并把参数递过去。

添加数据完成。

private void addNode(int data){
    if(this.next == null){
        this.next = new Node(data);
    }else{
        this.next.addNode(data);
    }
}

输出所有数据

		我们回到main方法中

咱们通过add方法多加几个数据,然后通过print方法输出所有数据。

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	nwbl.add(9);
	nwbl.add(11);
	nwbl.add(13);
	nwbl.add(15);
	nwbl.print();	//输出所有数据
}
		我们回到外部类print方法中。

首先要判断根节点是否为空,也就是第一个数字是否为空

  • 如果否,就输出根节点(说明根节点有数据)
  • 调用内部类中的printNode方法(继续输出其他节点上的数据)
public void print(){
    if(root!=null){
        System.out.print(root.data+"=>");
        root.printNode();
        System.out.println();
    }
}
		内部类中的printNode方法:

判断内部类中的next是否为空

  • 如果否,输出该节点数据(说明该节点存在)
  • 继续调用next中的printNode方法,直到nex为空。

输出所有数据完成。

private void printNode(){
    if(this.next!=null){
        System.out.print(this.next.data+"=>");
        this.next.printNode();
    }
}

删除数据

		我们回到main方法中

通过del方法删除数据

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	nwbl.add(9);
	nwbl.add(11);
	nwbl.add(13);
	nwbl.add(15);
	nwbl.del(11);		//删除元素为11的数据。
}
		我们回到外部类del方法中。

判断参数是否跟根节点相同

  • 如果是,把第二个节点赋给第一个节点(根节点被覆盖,从而达到删除效果)
  • 如果否,调用内部类中delNode方法,并把参数传递过去。
public void del(int data){
    if(root.getData() == data){
        root = root.next;
        countindex--;
    }else{
        root.delNode(data);
    }
}
		内部类中的delNode方法

判断next是否为空,
如果否,再判断数据data跟参数data是否相等。

  • 如果是,把数据next中的下一个next赋给现在的next。
  • 如果否,继续调用next中的delNode()方法,并把参数传递过去。

删除数据完成。

private void delNode(int data){
    if(this.next!=null){
        if(this.next.data == data){
            this.next = this.next.next;
        }
        else{
            this.next.delNode(data);
        }
    }
}

其他几个方法也同样利用递归算法实现查找,插入,修改等操作。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言可以通过结构体和指针来实现动态链表增删改查操作。下面是一个简单的示例代码: 首先,定义一个结构体表示链表的节点: ```c typedef struct Node { int data; // 节点数据 struct Node* next; // 指向下一个节点的指针 } Node; ``` 接下来,定义一些基本的操作函数: 1. 创建一个新节点: ```c Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } ``` 2. 在链表末尾插入一个节点: ```c void insertNode(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; } else { Node* current = *head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } ``` 3. 删除指定数值的节点: ```c void deleteNode(Node** head, int data) { if (*head == NULL) { return; } Node* current = *head; Node* prev = NULL; while (current != NULL && current->data != data) { prev = current; current = current->next; } if (current == NULL) { return; } if (prev == NULL) { *head = current->next; } else { prev->next = current->next; } free(current); } ``` 4. 修改指定数值的节点: ```c void modifyNode(Node* head, int oldData, int newData) { Node* current = head; while (current != NULL && current->data != oldData) { current = current->next; } if (current != NULL) { current->data = newData; } } ``` 5. 查找指定数值的节点: ```c Node* searchNode(Node* head, int data) { Node* current = head; while (current != NULL && current->data != data) { current = current->next; } return current; } ``` 使用这些函数,你可以实现对动态链表增删改查操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值