1.概述
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。
2.单向链表结构
-
存储多个元素,另外一个选择就是使用链表。
-
链表是以节点的方式存储数据
-
不同于数组,链表中的元素在内存中不必是连续的空间。
-
链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针)组成。
地址 | data域 | next域 |
0x0000(head) | null | 0x3344 |
0x3344 | 12 | 0x5673 |
0x4399 | 76 | 0x9436 |
0x5673 | 23 | 0x4399 |
0x9436 | 47 | null |
3.单向链表逻辑结构
4.单向链表的优点
(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小
(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据
(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表
5.单向链表缺点
(1)只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。
(2)在进行查询时,搜索一个节点需要遍历链表,在情况不好的情况下可能下需要到链表尾才能找到。
(3)链表需要多维护一个next的域,占据了更多的内存
6.java代码实现单向链表
@Test
public void test13() {
LinkedList linkedList = new LinkedList();
// Scanner scanner = new Scanner(System.in);
Person person = new Person(1, "才是");
Person person2 = new Person(2, "wd");
// String s = scanner.next();
linkedList.addNode(person);
linkedList.addNode(person2);
linkedList.list();
linkedList.updateNode(new Person(2,"是的"));
linkedList.list();
linkedList.deleteNode(person2);
linkedList.list();
}
@Data
class Person {
private Integer personNo;//编号
private String personName;//名字
private Person next;//下一个结点
public Person(Integer personNo, String personName, Person next) {
this.personNo = personNo;
this.personName = personName;
this.next = next;
}
public Person(int personNo, String personName) {
this.personNo = personNo;
this.personName = personName;
}
@Override
public String toString() {
return "Person{" +
"personNo=" + personNo +
", personName='" + personName + '\'' +
'}';
}
}
class LinkedList {
private Person head;//头结点
private Person last;//尾结点
private int length;//节点的位置
public LinkedList() {
head = new Person(0, "", null);
last = new Person(0, "", null);
length = 0;
}
public LinkedList(Person head, Person last) {
this.head = head;
this.last = last;
}
public void addNode(Person person) {
Person temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = person;
System.out.println("添加结点成功"+person);
}
public void deleteNode(Person person) {
Person temp = head;
boolean blag=false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.personNo == person.personNo) {
blag=true;
break;
}
temp = temp.next;
}
if (blag){
temp.next = temp.next.next;
System.out.println("删除结点成功"+person);
}else {
System.out.println("没有找到删除的结点");
}
}
public void list(){
Person temp =head;
while (true){
if (temp.next!=null){
System.out.println(temp.next);
}else {
break;
}
temp=temp.next;
}
}
public void updateNode(Person person){
Person temp = head;
boolean blag=false;
while (true){
if (temp.next.personNo==person.personNo){
blag=true;
break;
}if (temp.next==null){
break;
}
temp=temp.next;
}
if (blag){
temp.next.personNo=person.personNo;
temp.next.personName=person.personName;
System.out.println("修改结点成功");
}else {
System.out.println("未找到改结点");
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64401.html