java——单链表的实现

目录

单链表的组成:

1.Node类(节点类)

2.SingleLinkedList类

单链表的实现:

add

del

modify

check

show

单链表的测试:


单链表的组成:

java中单链表的实现由两个类组成,分别是:

  • 1.Node类(节点类)

public class Node {
    //data域
    public int age;
    public String name;
    //next域
    public Node next;

这个类是用来存入数据的,类的属性中有data域和next域,data域顾名思义就是用来存入数据的,比如上图中data域中有age和name两个数据,而next域中用来存入一个Node的指针,用来指向下一个节点,这样两个节点就有了联系,这就是链表中的“链”,

  • 2.SingleLinkedList类

这个类用来实现对链表的增删改查,展示等功能

单链表的实现:

首先我们对Node类进行处理,重写构造函数,重写toString方法(为了更方便的展示),代码如下:

package linkedlist;

public class Node {
    //data域
    public int age;
    public String name;
    //next域
    public Node next;

    //构造器
    public Node(int age, String name) {
        this.age = age;
        this.name = name;

    }

    //为了显示方便,重写toString()方法
    @Override
    public String toString() {
        return "Node{" +
                "age=" + age +
                ", name='" + name +
                "'}";
    }


}

其次是SingleLinkedList类的实现,首先初始化一个头节点,这个头节点不能动,否则会导致整个链表的丢失,因为每次对链表的访问都需要通过一个辅助变量temp从头节点开始,通过循环依次访问,在循环中对一个节点中的数据进行操作后,都需要有temp = temp.next,这样才能遍历链表。

public class SingleLinkedList {
    //这个类用来管理节点

    //先初始化一个头节点,头节点不能动,否则会导致整个链表丢失

    private Node head = new Node(0, " ");

接下来是单链表的增删改查功能

  • add

(这里是加到链表的最末尾,如果想要加到特定位置,可以参考删除链表元素中的代码)

要向往链表的末尾加入节点,首先我们得找到这个链表的结尾,在链表的最后一个节点,它的next域是指向空指针的,依据这个特点,我们通过遍历链表,找到节点的next域为空指针的节点,则此节点就是链表的末尾,之后再将末尾节点的next域指向想要添加的节点即可,代码如下:

 public void add(Node node) {
        /*我们怎么去向一个单链表的末尾中添加节点呢?
            假设我们现在已有一个单链表了,既然我们要向其末尾加入一个节点,
            我们肯定要找到这个链表的末尾,怎么去找到这个链表的末尾呢?
            这里我们通过一个辅助变量来遍历这个节点,因为头节点是不能动的
        */
        Node temp;
        temp = head;
        while (true) {
            if (temp.next != null) {
                temp = temp.next;
            } else {
                temp.next = node;
                break;
            }
        }

    }
  • del

删除节点方法中需要匹配想要删除的节点,同时注意空指针异常的问题

 //删除链表中元素
    //传入参数为想要删除的节点的data域,是为了匹配到想要删除的节点
    public void delNode(int _age, String _name) {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next.age == _age && temp.next.name.equals(_name)) {
                //条件匹配,找到想要删除的节点
                temp.next = temp.next.next;
                break;
            } else {
                temp = temp.next;
                /*
                以下if语句是判断当没有匹配到想要删除的节点时的操作
                这里直接判断temp.next是否为空,为空就直接表示没有找到想要的删除的节点,
                不需要再判断temp指向的节点是否匹配想要删除的节点了,
                因为在这次的if_else中,if已经对最后一个节点进行检查过了,而且是不匹配才会转到else语句的
                */
                if (temp.next == null) {
                    System.out.println("没有找到想要删除的节点");
                    break;

                }
            }
        }
    }

  • modify

//改动链表中元素
    //传入参数为想要改动的节点和改动后的节点的data域
    public void modifyNode(int age, String name, int _age, String _name) {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next.age == age && temp.next.name.equals(name)) {
                temp.next.age = _age;
                temp.next.name = _name;
                break;

            } else {
                temp = temp.next;
                //与delNode()方法相同道理
                if (temp.next == null) {
                    System.out.println("没有找到想要修改的节点");
                    break;

                }

            }

        }


    }
  • check

  //查找节点,有则返回true,无则false
    public boolean checkNode(int age, String name) {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next.age == age && temp.next.name.equals(name)) {
                return true;
            } else {
                temp = temp.next;
                //与delNode()方法相同道理
                if (temp.next == null) {
                    return false;

                }
            }


        }


    }
  • show

 public void show() {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next == null) {
                System.out.println(temp);
                break;
            } else {
                System.out.println(temp);
                temp = temp.next;
            }


        }
        System.out.println();

    }

单链表的测试:

package linkedlist;

public class Main {
    public static void main(String [] args){
        Node first = new Node(10,"first");
        Node second = new Node(20,"second");
        Node third = new Node(30,"third");
        SingleLinkedList test = new SingleLinkedList();
        test.add(first);
        test.add(second);
        test.add(third);
        test.show();

       test.modifyNode(10,"first",100,"first_1");
       test.show();

       if(test.checkNode(20,"second")){
           System.out.println("存在此节点");

       };
    }

}

 

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于实现多项式的相加和相乘,可以使用单链表来存储多项式的每一项。 首先,我们可以创建一个节点类来表示多项式中的每一项: ```java class Node { int coefficient; // 系数 int exponent; // 指数 Node next; // 下一个节点 Node(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; this.next = null; } } ``` 然后,我们可以创建一个链表类来管理多项式的各个节点: ```java class Polynomial { Node head; Polynomial() { this.head = null; } // 添加节点 void addTerm(int coefficient, int exponent) { Node newNode = new Node(coefficient, exponent); if (head == null) { head = newNode; } else { Node temp = head; while (temp.next != null) { temp = temp.next; } temp.next = newNode; } } } ``` 接下来,我们可以实现多项式的相加和相乘的方法: ```java class PolynomialOperations { // 相加两个多项式 static Polynomial addPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; Node p2 = poly2.head; while (p1 != null && p2 != null) { if (p1.exponent == p2.exponent) { result.addTerm(p1.coefficient + p2.coefficient, p1.exponent); p1 = p1.next; p2 = p2.next; } else if (p1.exponent > p2.exponent) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } else { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } } while (p1 != null) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } while (p2 != null) { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } return result; } // 相乘两个多项式 static Polynomial multiplyPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; while (p1 != null) { Node p2 = poly2.head; while (p2 != null) { result.addTerm(p1.coefficient * p2.coefficient, p1.exponent + p2.exponent); p2 = p2.next; } p1 = p1.next; } return result; } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { Polynomial poly1 = new Polynomial(); poly1.addTerm(2, 3); poly1.addTerm(1, 2); poly1.addTerm(3, 0); Polynomial poly2 = new Polynomial(); poly2.addTerm(1, 2); poly2.addTerm(2, 1); poly2.addTerm(4, 0); Polynomial sum = PolynomialOperations.addPolynomials(poly1, poly2); Polynomial product = PolynomialOperations.multiplyPolynomials(poly1, poly2); System.out.println("Sum of polynomials: "); printPolynomial(sum); System.out.println("Product of polynomials: "); printPolynomial(product); } // 打印多项式 static void printPolynomial(Polynomial poly) { Node temp = poly.head; while (temp != null) { System.out.print(temp.coefficient + "x^" + temp.exponent); if (temp.next != null) { System.out.print(" + "); } temp = temp.next; } System.out.println(); } } ``` 这样,我们就可以使用单链表实现多项式的相加和相乘了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值