单链表的各种操作

首先定义一个节点的数据结构

package ListNode;
//定义一个节点数据结构,包括指针和数据
public class Node {
    public Node next=null;
    public int data;
    public Node(int data){
        this.data=data;
    }
    public void display(){
        System.out.print(data+" ");
    }
}

链表的各种操作

package ListNode;
//注意node.next指的也是一个节点,可以直接赋值给另一个节点
public class LinkList {
    public Node first=null;//定义一个头节点,初始为空,
    //注意这个头结点只是在这里为空,后面凡是把这个first赋值给其他节点,都是正真的头结点,可能为空,也可能不是。
    public int pos=0;//节点位置
    //添加头结点,把数据data添加到头结点
    public void addFirstNode(int data){
        Node node=new Node(data);//创建一个数据区为data的节点
        node.next=first;
        first=node;
    }
    //删除头结点,并返回头结点
    public Node deleteFirstNode(){
        if(first==null){
            System.out.println("链表为空!");
        }
        Node tempNode=first;//创建一个临时节点tempNode,将头结点赋值给tempNode
        first=tempNode.next;//再把tempNode的下一个节点赋值给头结点
        return tempNode;    
    }
    //在位置index后面插入节点,节点的数据区为data,头结点位置为1
    public void add(int data,int index){
        Node node=new Node(data);
        Node current=first;//指向头结点,头结点可能不为空
        Node previous=first;//指向头结点,头结点可能不为空
        while(pos!=index){
            previous=current;
            current=current.next;
            pos++;
        }
        node.next=current;
        previous.next=node;
        pos=0;
    }
    //展示所有节点
    public void displayAllNodes(){
        Node current=first;//指向头结点,头结点可能不为空
        while(current!=null){
            current.display();
            current=current.next;
        }
        System.out.println();   
    }
    //查找数据区为data的节点,并返回该节点
    public Node findByData(int data){
        Node current=first;
        while(current.data!=data){
            if(current.next==null){
                return null;
            }
            current=current.next;
        }
        return current;
    }
    //查找在index位置的节点,并返回该节点
    public Node findByIndex(int index){
        Node current=first;
        while(pos!=index){
            current=current.next;
            pos++;
        }
        pos=0;
        return current;
    }
    //删除在index位置的节点,并返回该节点,头结点的位置为0
    public Node deleteByIndex(int index){
        Node current=first;
        Node previous=first;
        while(pos!=index){
            previous=current;
            current=current.next;
            pos++;
        }
        if(current==first){//如果删除的是头结点
            first=first.next;
        }else{
            previous.next=current.next;
            pos=0;
        }
        return current; 
    }
    //删除数据区为data的节点
    //注意删除的时候一定要判断删除的位置,是否是头结点,是否是尾节点,
    public void deleteByData(int data){
        Node current=first;
        Node previous=first;
        if(first.data==data){//删除的是头结点
            first=first.next;
        }
        while(current.next!=null){//删除除头尾节点的一般节点
            if(current.data==data){
                previous.next=current.next;
            }else{
                previous=current;
            }
            current=current.next;
        }
        if(current.next==null){//删除尾节点
            if(current.data==data){
                previous.next=null;
            }           
        }
    }
}

测试

package ListNode;
public class Test {
    public static void main(String[] args) {
        LinkList linkList=new LinkList();
        linkList.addFirstNode(12);
        linkList.addFirstNode(10);
        linkList.addFirstNode(19);
        linkList.addFirstNode(18);
        linkList.addFirstNode(15);
        linkList.addFirstNode(18);
        linkList.addFirstNode(40);
        linkList.addFirstNode(18);
        linkList.displayAllNodes();
        linkList.add(30,2);
        linkList.displayAllNodes();
        linkList.deleteFirstNode();
        linkList.displayAllNodes();
        linkList.deleteByIndex(5);
        linkList.displayAllNodes();
        linkList.deleteByIndex(3);
        linkList.displayAllNodes();
        Node resultNode1 = linkList.findByData(18);
        System.out.println(resultNode1.data);
        Node resultNode2=linkList.findByIndex(4);
        System.out.println(resultNode2.data);
        linkList.deleteByData(18);
        linkList.displayAllNodes();     
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值