今天开始学习数据结构-单链表
首先我们需要认识单链表,单链表就是元素之间环环相扣,需要有起始的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保存的。
结束:
完成了算法单链表的学习,第一次在这里记录自己的所学,希望是一个好的开端,加油
有错误的话可以帮我指出哦,谢谢!