一.单链表
1.单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
3.存储
A.基本数据类型
首先得有一个类表示链表,只有一个属性记录节点的头地址。
//链表类
class MyList{
Node head;
}
接下来是节点类,属性是data,和nextclass Node{
int data;//存储数据
Node next;//存储下一个几点对象的地址
}
其次是处理逻辑类:
public class LinkUtil {
//只负责存储第一个
MyList list = new MyList();
//初始化链表对象,将其head存储第一个对象的地址
void intiList(){
list.head = null;
}
void add(int date){
//创建一个节点
Node node= new Node();
//给节点两个属性赋值
node.data = date;
node.next = list.head;
//将第一父个节点 对象地址赋值给链表对象的head
list.head = node;
}
void delete(int data){
//删除第一个节点对象
if(list.head.data==data){
list.head=list.head.next;
return;
}
//第二种
Node p=list.head;
Node ppre = null;//ppre指向p的前一个节点
while(p!=null){
ppre = p;
p=p.next;
if(p.data==data){
ppre.next=p.next;
break;
}
}
}
//展示数据
void showAllNode(){
//p指向第一个节点对象
Node p = list.head;
while(p!=null) {
System.out.println(p.data);
p = p.next;
}
}
//修改数据
void exchange(int data,int newData){
Node p = list.head;
while(p!=null){
if(p.data==data){
p.data = newData;
break;
}
p = p.next;
}
/*if(p==null){
System.out.println("修改的值不存在!");
}*/
}
}
测试界面:
package com.se.link;
public class MyListTest {
public static void main(String[] args) {
LinkUtil l = new LinkUtil();
l.intiList();
l.add(3);
l.add(4);
l.add(5);
l.add(31);
l.add(41);
l.add(51);
//l.exchange(12, 331);
//l.delete(3);
l.showAllNode();
}
}
B.存储自定义对象
原理类似,在节点数据域存放的现在是对象的地址,拿到数据域有必要去转型。
package com.se.link;
public class ListStudent {
//只负责存储第一个
MyList1 list = new MyList1();
//初始化链表对象,将其head存储第一个对象的地址
void intiList(){
list.head = null;
}
void add(Student stu){
//创建一个节点
Node1 node= new Node1();
//给节点两个属性赋值
node.msg = stu;
node.next = list.head;
//将第一父个节点 对象地址赋值给链表对象的head
list.head = node;
}
//按姓名删除
void delete(String name){
Node1 p=list.head;
//删除第一个节点对象
Student stu = p.msg;
if(name.equals(stu.getName())){
list.head=list.head.next;
return;
}
//第二种删除非第一个节点
Node1 ppre = null;//ppre指向p的前一个节点
while(p!=null){
ppre = p;
p=p.next;
Student stu1 =p.msg;
if(name.equals(stu1.getName())){
ppre.next=p.next;
break;
}
}
}
//展示数据
void showAllNode(){
//p指向第一个节点对象
Node1 p = list.head;
while(p!=null) {
Student stu =p.msg;
System.out.println(stu.getName()+":"+stu.getAge());
p = p.next;
}
}
// 修改姓名修改数据
void exchange(String name,String newName){
Node1 p = list.head;
while(p!=null){
Student stu =p.msg;
if(name.equals(stu.getName())){
stu.setName(newName);
break;
}
p = p.next;
}
if(p==null){
System.out.println("修改的名字不存在!");
}
}
}
//节点类
class Node1{
Student msg;//存储数据
Node1 next;//存储下一个几点对象的地址
}
//链表类
class MyList1{
Node1 head;
}
class Student{
String name;
int age;
public Student(){}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试界面:
package com.se.link;
public class ListStudentTest {
public static void main(String[] args) {
ListStudent stu = new ListStudent();
stu.add(new Student("小明",18));
stu.add(new Student("小刚",22));
stu.add(new Student("小强",34));
stu.add(new Student("老王",54));
stu.exchange("小明", "李白");
stu.delete("小刚");
stu.showAllNode();
}
}
注意,增加节点主要是运用链表的头插法。