1.概念
1.没有下标的概念。
2.非线性空间,零散空间都可以存储,非连续。
3.在内存中存储一个对象,存储这个对象的引用地址。
2.定义
//节点类
public class Node<E> {
private Object val; //Object类型的变量
private Node next;
public Node(Node next, Object val){ //构造函数初始化,传入一个节点的值和其指向下一节点的指针
this.next = next;
this.val = val;
}
}
\\数组列表
public class MyLinkList<E>{
Node head; //头结点
Node tail; //尾结点
int count; //节点个数;//根据一个元素创建一个链表,即是头也是尾节点
public MyLinkList(){ //初始化构造方法:空构造方法
}
}
3.链表列表常见操作:增删查改,插入
//在头前增加节点
public void addBfHead(Node node){
if(head == null){
head = node; //头为空,该节点为头结点
}
else{ //头不为空,该节点指向原头结点,头结点为该节点
node.setNext(head);
head = node;
}
count++;
}
//在尾节点后增加节点
public void addAfHead(Node node){
if(head == null){
head = node; //头为空,该节点为头结点
}
else{ //头不为空,查询到尾节点,尾结点.next为该节点
Node cur = head; //设置查询节点
while (cur.getNext() != null){
cur = cur.getNext();
}
cur.setNext(node);
}
count++;
}
//查询节点
public Node search(E val){ //从头结点开始查询
Node node = head; //设置查询节点
while(node != null){
if(node.getVal() == val){
// System.out.println(node.getVal());
return node;
}
node = node.getNext();
}
return null;
}
//删除节点,先查后删
public void delete(E val){
Node pre = null; //当前节点的前一节点
Node node = head;
if(head.getVal() == val) { //如果删除头结点
Node p = head;
head = p.getNext();
p = null;
}
else {
while (node != null) {
if (node.getVal() == val) { //当前节点值为查询节点值
pre.setNext(node.getNext()); //当前节点前一节点指向当前节点后一节点
node = null; //释放当前节点
} else {
pre = node; //当前节点值不为查询节点值,前一节点为当前节点
node = node.getNext(); //当前节点指向下一节点
}
}
}
count--;
}
//改节点值,先查后改,查询值为val的节点,将值改为k
public void change(E val, E k){
Node node = search(val);
node.setVal(k);
}
//前插法
public void BfInsert(E val, Node node){//查询到值为val的节点,1.pre.next=node, 2.node.next=cur
Node pre = null; //当前节点的前一节点
Node cur = head;
if(head.getVal() == val){ //如果头结点为查询到的节点
node.setNext(head);
head = node;
}
else {
while (cur != null) {
if (cur.getVal() == val) { //当前节点值为val
pre.setNext(node);
node.setNext(cur);
System.out.println("cur.getVal()"+cur.getVal());
return; //循环中必须有结束或跳出语句
} else {
pre = cur; //当前节点值不为查询节点值,前一节点为当前节点
cur = cur.getNext(); //当前节点指向下一节点
}
}
}
count++;
}
//后插法
public void AfInsert(E val, Node node){
Node cur = search(val); //查询到值为val的节点,1.传入节点.next=val节点.next, 2.val.next=传入节点
node.setNext(cur.getNext());
cur.setNext(node);
count++;
}