算法通关村第一关——链表青铜挑战笔记

本文介绍了单链表的基本概念,包括其环环相扣的元素结构和表头节点。通过创建StudentNode类来表示节点,包含学生姓名和ID。接着展示了如何在单链表中添加节点(头部、尾部和中间),以及删除节点(首、尾和中间)。代码示例演示了这些操作的过程。
摘要由CSDN通过智能技术生成

今天开始学习数据结构-单链表

首先我们需要认识单链表,单链表就是元素之间环环相扣,需要有起始的head节点也就是表头,里面可以有很多属性和指向下一个元素节点的指针,这样元素就会串联下去

 已经知道了单链表的结构了,我们试试创建一个吧

public class StudentNode {
    public String name;
    public int  studentId;
    StudentNode next;

    public StudentNode(String name, int studentId) {
        this.name = name;
        this.studentId = studentId;
    }
    public StudentNode() {

    }

    @Override
    public String toString() {
        return "StudentNode{" +
                "name='" + name + '\'' +
                ", studentId=" + studentId +
                ", next=" + next +
                '}';
    }
}

创建单链表的前提是创建一个节点,我们这里创建了StudentNode节点,包含了学生名字、学生id和下个学生

现在我们开始创建链表

public class StudentNodeList {
    //创建头节点
    StudentNode head = new StudentNode();

    //向链表的最后添加节点
    public void addStudentLast(StudentNode studentNode) {
        StudentNode lastStudent = head;
        while (lastStudent.next != null) {
            lastStudent = lastStudent.next;
        }
        lastStudent.next = studentNode;
    }

    //向链表头部添加节点
    public void addStudentFirst(StudentNode studentNode) {
        //如果头节点的后面没有数据,直接添加
        if (head.next == null) {
            head.next = studentNode;
        }
        //首先先让插入的节点的next指向head的next节点
        studentNode.next = head.next;
        //然后再让head指向该节点
        head.next = studentNode;
    }

    //向链表的中间添加节点
    public void addStudentIndex(StudentNode studentNode, int index) {
        if (head.next == null) {
            head.next = studentNode;
        } else {
            if (index == 1) {
                studentNode.next = head.next;
                head.next = studentNode;
            } else {
                StudentNode current = head;
                for (int i = 1; i < index; i++) {
                    current = current.next;
                }
                studentNode.next = current.next;
                current.next = studentNode;
            }
        }
    }

}

向链表的头部插入节点:

我们首先要把要插入的节点的next指向当前的头结点的next,然后再让头结点的next指向要插入的节点,如果我们换一下顺序,那么先让头结点的next指向要插入的节点,那么原本的头结点的next没有保存的话就会丢失,我们无法将需要插入的节点的next指向它。

向链表的中间插入节点: 

这个颠倒顺序的话也会出现上述问题

向链表的尾部添加节点:

 这个我们只需要遍历链表找到节点的next为空的节点,然后把它的next指向需要添加的节点就行啦

 测试一下

  public static void main(String[] args) {
        StudentNode zhangSan = new StudentNode("zhangSan", 1);
        StudentNode zhaoSi = new StudentNode("zhaoSi", 2);
        StudentNode wangWu = new StudentNode("wangWu", 3);
        StudentNode zhaoLiu = new StudentNode("zhaoLiu", 4);
        StudentNodeList studentNodeList = new StudentNodeList();
        studentNodeList.addStudentLast(zhangSan);
        studentNodeList.addStudentLast(wangWu);
        studentNodeList.addStudentIndex(zhaoSi, 2);
        studentNodeList.addStudentIndex(zhaoLiu, 4);
        System.out.println(studentNodeList.head);
    }

输出的结果是:StudentNode{name='null', studentId=0, next=StudentNode{name='zhangSan', studentId=1, next=StudentNode{name='zhaoSi', studentId=2, next=StudentNode{name='wangWu', studentId=3, next=StudentNode{name='zhaoLiu', studentId=4, next=null}}}}}

顺序是1234

链表增加我们就写完了,然后写删除

删除首个节点

我们只需要把头节点指向第一个节点的next

public void removeFirstNode() {
        head.next=head.next.next;
    }

 

删除尾部节点

需要找到删除的目标节点的前一个节点,node.next=目标节点

public void removeLastNode() {
        StudentNode lastNode =head.next;
        if (lastNode!=null){
            while (lastNode.next.next!=null){
                lastNode=lastNode.next;
            }
            lastNode.next=null;
        }

    }

 删除中间节点

    public void removeIndexNode(int index){
        if (head.next!=null){
            if (index ==1){
                head.next=head.next.next;
            }else {
                StudentNode indexNode = head;
                StudentNode temp = null;
                for (int i = 1; i <index ; i++) {
                    if (indexNode==null){
                        StudentNode lastNode =head.next;
                        while (lastNode.next.next!=null){
                            lastNode=lastNode.next;
                        }
                        indexNode = lastNode;
                        break;
                    }
                    temp = indexNode;
                    indexNode = indexNode.next;
                }
                if (indexNode.next==null){
                    temp.next=null;
                }else {
                    indexNode.next=null;
                }
            }
        }
    }

如果还没遍历到指定index时,链表已经结束,那么就返回最后节点的上一个节点,这个节点的next肯定不为空最后执行的是indexNode.next=null;正常遍历完之后得到的indexNode是要删除节点的前一个节点,要判断要删除的节点是不是为null,如果为null的话就把这个最后得到的indexNode置为null,这里要使用到前一个节点,是用temp保存的。

结束:

完成了算法单链表的学习,第一次在这里记录自己的所学,希望是一个好的开端,加油

有错误的话可以帮我指出哦,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值