java单链表的操作

package com.areio.offer;

//结点
public class Node {
    //当前结点的值
    int val;
    //下一个结点
    Node next;

    public Node(){}

    public Node(int val){
        this.val=val;
    }

    public Node(int val, Node next){
        this.val=val;
        this.next=next;
    }

    @Override
    public String toString() {
        return "Node{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}
package com.areio.offer;

public class _6A_LinkList {



    //注意java是值传递,head作为形参,改变形参引用的地址,实参是不会跟着变的,仍然指向一开始的头结点所在地址。所以head不要做形参,做成员变量
    private  Node head;
    public _6A_LinkList(){}

    public Node getHead(){
        return this.head;
    }

    /*
    * 向链表的最后插入一个值为val的结点
    *
    * val是待插入结点的值
    *
    * */
    public void insertToLast(int val){
        //1、如果链表为空,待插入结点成为头结点;否则待插入结点是尾结点

        //创建新结点
        Node newNode=new Node(val,null);
        //创建一个指针p,代表当前遍历结点的位置,初始化指向头结点的位置,当其到达空位置,新节点此时可插入
        //p是头结点对象的引用,head需要是成员变量;
        // 如果是形参传进来,那么一旦形参head改变,实参head指向的地址却没变
        Node p=head;

        if (head==null){
            head=newNode;
            return;
        }

        while (p.next!=null){
            p=p.next;
        }
        //此时p.next==null,此时p是最后一个结点的引用,它的成员属性next修改,对象也会修改
        p.next=newNode;
    }


    /*
    * 查出头结点为head的链表中第一个值为val的结点,并删除该结点
    * head不作为形参,因为一旦key是头结点,那么形参head指向新结点的地址,而实参head扔指向原来的结点
    * */
    public void findOneAndDel(int key){
        //1、原链表为空,直接返回null
        //2、第一个值为val的结点是头结点,那么head=head.next;如果不是头结点,是p.next,则p.next=p.next.next

        //原链表为空
        if (head==null){
            return;
        }
        //值key在头结点
        if (head.val==key){
            head=head.next;
            return;
        }
        //p表示当前访问结点,从头结点开始访问
        Node p=head;
        //值key不在头结点
        while (p.next!=null&&p.next.val!=key){//如果链表没有这个结点,它会遍历到p=null  那么p.next 相当于null.next
            p=p.next;

        }
        //到这说明要么p.next.val==key,要么p.next==null
        if (p.next==null){
            //必须先判断是不是p.next==null,如果先判断p.next.val,则可能导致null.val
            //如果是p.next==null则什么都不用做
            return;
        }
        //到这说明p.next.val==key
        p.next=p.next.next;

    }
    //创建单链表
    public  void createLinkedList(int[] nums){
        for (int i=0;i<nums.length;i++){
            insertToLast(nums[i]);
        }
    }
    //遍历链表
    public  void printList(Node head){
        Node p=head;
        while (p!=null){
            System.out.print(p.val+" ");
            p=p.next;
        }
        System.out.println();
    }

}
package com.areio.offer;


public class _6A_Test {
    public static void main(String[] args) {
        _6A_LinkList linkList=new _6A_LinkList();

        //创建一个链表,此时头结点肯定是空的,所以在创建链表的时候需要考虑到
        int[] nums=new int[]{4,8,8,6,7};
        linkList.createLinkedList(nums);

        linkList.printList(linkList.getHead());

        linkList.findOneAndDel(4);
        linkList.printList(linkList.getHead());
        linkList.insertToLast(9);
        linkList.printList(linkList.getHead());
        linkList.findOneAndDel(8);
        linkList.printList(linkList.getHead());

        linkList.insertToLast(4);
        linkList.printList(linkList.getHead());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值