java相关-链表(自定义)

package com.company;
import java.util.Iterator;
import java.util.LinkedList;

public class DefLinkNode {

    /**
     * 1新增链表类
     * 2新增链表实例
     * 3新增链表节点:逐个从第一个节点开始加,并加上链表节点关系。
     * 4删除链表节点:删除任意一个节点,删除第一个节点
     * 5读取链表内容:读取所有节点的值
     * 6修改链表某个节点的值:修改任意一个节点的值
     * 7取链表的值:取任意一个节点的值
     * 8计算链表长度:从任意一个节点开始计算到末尾的长度
     * 9插入节点:从中间插入节点
     * @param args
     */
    public static void main(String[] args) {
        //链表的每个值就是一个节点,这个节点就是定义的链表类。
        //定义第一个链表节点
        LinkNode head=new LinkNode();//使用无参构造初始化
        head.val=2;//直接赋值
        System.out.println("第一个节点的值为"+head.val);

        //定义第二个链表节点:1.必须用第一个节点关联第二个节点  2.必须定义第二个节点的值
        LinkNode second=new LinkNode();
        second.val=3;
        head.next=second;
        System.out.println("第一个节点的下个节点为"+head.next+"  第二个节点的值为:"+head.next.val);

        //计算链表长度:传第一个节点
        int length=getLength(head);
        System.out.println("链表长度为:"+length);

        //计算链表长度:传第二个节点
        int smallLength=getLength(second);
        System.out.println("第二个节点到末尾节点有多长:"+smallLength);


        //插入节点:在第一和第二节点间插入一个节点, 1.新建一个节点  2.断开第一和第二节点的关系   3.把新建的节点连上第一个节点   4.把最后一个节点连在新建的节点上
        LinkNode newNode=new LinkNode();
        newNode.val=4; //1.新建节点
        head.next=null;//2.断开第一个节点和第二个节点关系
        head.next=newNode;//3.把新建的节点连上第一个节点
        newNode.next=second;//4.把最后一个节点连在新建的节点上

       LinkNode current=head;//注意要从头开始
       String value="";
        while(current!=null){//注意这里不能直接传head,因为循环会改变head的位置
            value=value.concat(String.valueOf(current.val))+"  ";
            current=current.next;
        }
        System.out.println("插入节点后的值:"+value);//把所有节点按顺序逐个打印出来

        //删除第二个节点
        head.next=null;
        newNode.next=null;
        head.next=second;
        String value2="";
        LinkNode current2=head;//注意要从头开始
        while(current2!=null){
            value2=value2.concat(String.valueOf(current2.val))+"  ";
            current2=current2.next;
        }
        System.out.println("删除第二个节点后的值"+value2);//把所有节点按顺序逐个打印出来


        //先在末尾加一个节点
        LinkNode third=new LinkNode();
        third.val=5;
        second.next=third;


        //删除链表第一个节点:1.断开第一个节点和第二个节点的连接,第二个节点和后续节点的连接依然不变。后续的还是一个链表。
        head.next=null;//剩余的节点就从newNode开始了
        String value3="";
        LinkNode current3=second;//因为删除了第一个链表,所以此处只有从second节点开始
        while(current3!=null){
            value3=value3.concat(String.valueOf(current3.val))+"  ";
            current3=current3.next;
        }
        System.out.println("删除第一个节点后的值"+value3);//把所有节点按顺序逐个打印出来


        //修改链表某个节点的值
        third.val=8;
        String value4="";
        LinkNode current4=second;//因为删除了第一个链表,所以此处只有从second节点开始
        while(current4!=null){
            value4=value4.concat(String.valueOf(current4.val))+"  ";
            current4=current4.next;
        }
        System.out.println("修改链表某个节点后的值"+value4);//把所有节点按顺序逐个打印出来

    }


    public static class LinkNode{
        private int val;//链表的值,可以定义为任意值,根据业务需求定,不一定是int
        private LinkNode next;//链表的每个元素都是属于一样的类
    }

    public static int getLength(LinkNode node){//这里传链表的一个节点,如果传的头节点就计算链表的长度,如果传的链表的中间某个节点,就从链表中间某个节点计算到末尾的长度
        int length=0;
        while(node!=null){
            length=length+1;
            node=node.next;

        }
        return length;
    }


}

----

### Java 数据结构 链表 实现教程 #### 单链表的定义与基本实现 在 Java 中,单链表可以通过自定义类来实现。以下是基于引用的内容构建的一个完整的单链表实现方案。 ```java public class LinkedList { // 定义内部节点类 public static class Node { public int data; // 假设节点存储的数据类型为 int public Node next; public Node(int data) { this.data = data; this.next = null; } } private Node head = null; // 初始化头节点为空 // 添加节点的方法 public void addNode(int data) { Node newNode = new Node(data); if (head == null) { // 如果链表为空,则新节点作为头节点 head = newNode; } else { Node temp = head; while (temp.next != null) { // 找到最后一个节点 temp = temp.next; } temp.next = newNode; // 将新节点连接到最后一个节点之后 } } // 获取链表长度(不统计头节点) public int getLength() { if (head == null) { // 空链表返回 0 return 0; } int length = 0; Node current = head; while (current != null) { // 遍历整个链表 length++; current = current.next; } return length; } // 输出链表内容 public void displayList() { Node node = head; while (node != null) { System.out.print(node.data + " -> "); node = node.next; } System.out.println("null"); } } ``` 上述代码实现了单链表的基本功能,包括添加节点、计算链表长度以及打印链表内容的功能[^1]。 --- #### 链表的特点及其存储方式 链表是一种物理存储单元上非连续、非顺序的存储结构。它的特点是数据元素之间的逻辑顺序通过链表中的指针链接次序实现。具体来说,链表由一系列结点组成,每个结点包含两部分:一部分用于存储数据元素(即数据域),另一部分用于存储下一个结点地址(即指针域)。这种特性使得链表能够在运行时动态生成新的结点[^2]。 --- #### 计算链表的有效节点数量 为了获取单链表中有效节点的数量,可以采用以下方法: ```java public static int countNodes(Node head) { if (head == null || head.next == null) { // 判断是否为空链表或者只有一个头节点 return 0; } int count = 0; Node currentNode = head.next; // 不统计头节点本身 while (currentNode != null) { count++; currentNode = currentNode.next; } return count; } ``` 此函数能够有效地忽略头节点并仅统计实际有效的数据节点[^3]。 --- #### 遍历环形链表 如果需要处理的是环形链表,则其遍历方式略有不同。通常情况下,会利用辅助指针 `cur` 来完成这一操作。例如,在环形链表中找到某个特定条件下的节点或执行其他复杂操作时,可按照如下方式进行: ```java // 创建环形链表 public static void createCircularLinkedList(Node[] nodes) { for (int i = 0; i < nodes.length - 1; i++) { nodes[i].next = nodes[i + 1]; } nodes[nodes.length - 1].next = nodes[0]; // 形成闭环 } // 遍历环形链表 public static void traverseCircularList(Node first) { if (first == null) { return; } Node cur = first; do { System.out.print(cur.id + " -> "); cur = cur.next; } while (cur != first); // 当回到起点时停止 System.out.println(first.id); // 补充最后一个节点输出 } ``` 这段代码展示了如何创建和遍历环形链表的过程[^4]。 --- #### 总结 以上介绍了单链表的基础概念及其实现细节,并进一步探讨了如何计算链表长度以及遍历环形链表的具体方法。这些知识点构成了理解 Java 数据结构中链表的核心基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值