[Java]Java实现链表

Java实现链表

package untils;

public class _Linked {
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    /* 有头结点的链表 */
    private ListNode head = new ListNode(0);

    //添加节点到单向链表
    //思路,当不考虑编号顺序时
    //1. 找到当前链表的最后节点
    //2. 将最后这个节点的next 指向 新的节点
    public void add(ListNode heroNode) {
        //因为head节点不能动,因此我们需要一个辅助遍历 temp
        ListNode temp = head;
        //遍历链表,找到最后
        while(true) {
            //找到链表的最后
            if(temp.next == null) {
                break;
            }
            //如果没有找到最后, 将将temp后移
            temp = temp.next;
        }
        //当退出while循环时,temp就指向了链表的最后
        //将最后这个节点的next 指向 新的节点
        temp.next = heroNode;
    }

    /*
     * 正向输出链表
     */
    public void list() {
        //判断链表是否为空
        if(head == null) {
            System.out.println("链表为空");
            return;
        }
        //因为头节点,不能动,因此我们需要一个辅助变量来遍历
        ListNode temp = head;
        while(true) {
            //判断是否到链表最后
            if(temp == null) {
                break;
            }
            //输出节点的信息
            System.out.print(temp.val + " ");
            //将temp后移, 一定小心
            temp = temp.next;
        }
        System.out.println();
    }


    /*
     * 反向输出链表,三种方式:
     * 方法一、先反转链表,再输出链表,需要链表遍历两次
     * 方法二、把链表中的数字放入栈中再输出,需要维护额外的栈空间
     * 方法三、依据方法2中栈的思想,通过递归来实现,递归起始就是将先执行的数据压入栈中,再一次出栈
     */
    public void reservePrt(ListNode head){
        if (head != null){
            reservePrt(head.next);
            System.out.print(head.val+"->");
        }
    }

    /*
    删除值为number的节点
    思路:
        1. head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
        2. 说明我们在比较时,是temp.next.no 和  需要删除的节点的no比较
    */
    public void del(int number) {
        ListNode temp = head;
        boolean flag = false;
        while(temp.next != null){
            if(temp.next.val == number){
                temp.next = temp.next.next;
                flag = true;
            }else{
                temp = temp.next;
            }
        }
        if(flag){
            System.out.println("已删除值为" + + number + "的结点!" );
        }else{
            System.out.println("未找到值为" + + number + "的结点!" );
        }
    }

    /* 修改节点的信息, 根据no编号来修改,即no编号不能改.
	说明
	1. 根据 newHeroNode 的 no 来修改即可
	*/
    public void update(Integer oldNumber,Integer newNumber) {
        ListNode temp = head;
        boolean flag = false;
        while(temp.next != null){
            if(temp.next.val == oldNumber){
                temp.next.val = newNumber;
                flag = true;
            }else{
                temp = temp.next;
            }
        }
        if(flag){
            System.out.println("已修改值为" + oldNumber + "的结点,修改后的值为" + newNumber);
        }else{
            System.out.println("未找到值为" + + oldNumber + "的结点!" );
        }
    }
    
    
    public static void main(String args[]){
        ListNode node = new ListNode(1);
        /* 初始化的同时吧node设置为头结点 */
        _Linked linked = new _Linked();
        node = new ListNode(1);
        linked.add(node);
        node = new ListNode(2);
        linked.add(node);
        node = new ListNode(3);
        linked.add(node);
        node = new ListNode(4);
        linked.add(node);
        node = new ListNode(7);
        linked.add(node);
        node = new ListNode(3);
        linked.add(node);
        node = new ListNode(9);
        linked.add(node);
        node = new ListNode(4);
        linked.add(node);
        node = new ListNode(10);
        linked.add(node);
        linked.list();
        linked.del(1);
        linked.list();
        linked.del(4);
        linked.list();
        linked.del(20);
        linked.list();

        linked.update(2,10);
        linked.list();
        /* 倒序输出 */
        linked.reservePrt(linked.head);
    }
}
发布了84 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36254699/article/details/101115191