哈喽,这回我又开始学习Java的链表了,内心是大写的苦逼,真的摄入知识点真的有点杂,但还是要坚持记笔记呀。
还是简单说一下链表是个嘛呀?
它就是个数据结构,和数组是同级的
不太好理解对吧,这样我们再来图表示一下
实际上呢,链表也是一样的。
操作链表
*链表的操作方法与数组不同,我们是不能利用常量的时间内访问单链表的随机元素
如果我们想要获得某个元素的时候,我们需要做的是从头节点逐个遍历
public class Mylink {
Cur head = null; // 使用給定值初始化新節點cur
/**
* name:Mylink
* 功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
* ------------------------------------------------ --------
* 作者:lxw: 修改时间:2019年9月21日
*
*
*/
class Cur {
Cur next = null;// 將cur的next的字段链接到下一个结点
int val;//定义一个值,作为节点内容
public Cur(int data) {
this.val = data;
}
}
添加
1.使用给定值初始化新节点个人认为null是个很厉害的东西我们可以使用null直接赋值
2.我们要将新的节点next字段链接到下一个节点的next
3.还要将上一个节点的next链接到新的节点
与数组不同,我们不需要把所有元素移动到插入元素之后,因此,你可以高效的将元素插入链表。
删除
删除链表也是个技术活
1.找到新节点的上一个节点还有下一个节点的next
2.接下来删了新节点再把上一个节点和下一个节点连起来
如果理解不了,那就看图吧
继续上代码:
/**
* NAME:deleteNode
* 功能:删除第index个节点
* 参数:index
* --------------------------------
*/
public boolean deleteNode(int index) {
if (index < 1 || index > length()) {
return false;
}
if (index == 1) {
head = head.next;
return true;
}
int i = 1;
Cur preNode = head;
Cur curNode = preNode.next;
while (curNode != null) {
if (i == index) {
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return false;
}
不知道有没有人跟我一样写Boolean,习惯写成bool的【擦汗】
我总有一个冲动,就是不给数据赋值,我喜欢让大家自己赋值,这里就得使用Java的一个头文件
import java.util.Scanner;
今天的学习成果还是看程序吧:
【这个是自己给链表赋值,在它下面的程序是用数组元素来赋值的】
import java.util.Scanner;
public class Mylink {
Cur head = null; // 使用給定值初始化新節點cur
/**
* name:Mylink
* 功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
* ------------------------------------------------ --------
* 作者:lxw: 修改时间:2019年9月21日
*
*
*/
class Cur {
Cur next = null;// 將cur的next的字段链接到下一个结点
int val;//定义一个值,作为节点内容
public Cur(int data) {
this.val = data;
}
}
/**
* 功能:向链表中插入数据
*
* 参数:d
*/
public void addNode(int d) {
Cur newCur = new Cur(d);// 实例化一个节点
if (head == null) {
head = newCur;
return;
}
Cur temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newCur;
}
/**
* NAME:deleteNode
* 功能:删除第index个节点
* 参数:index
* --------------------------------
*/
public boolean deleteNode(int index) {
if (index < 1 || index > length()) {
return false;
}
if (index == 1) {
head = head.next;
return true;
}
int i = 1;
Cur preNode = head;
Cur curNode = preNode.next;
while (curNode != null) {
if (i == index) {
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return false;
}
/**
* NAME:deleteNode11
* 功能:在不知道头指针的情况下删除指定节点
* 参数:n ----------------------
*/
public boolean deleteNode11(Cur n) {
if (n == null || n.next == null) {
return false;
}
int temp = n.val;
n.val = n.next.val;
n.next.val = temp;
n.next = n.next.next;
System.out.println("删除成功!");
return true;
}
/**
* NAME:length 功能:返回节点长度
*/
public int length() {
int length = 0;
Cur tmp = head;
while (tmp != null) {
length++;
tmp = tmp.next;
}
return length;
}
public void printList() {
Cur tmp = head;
while (tmp != null) {
System.out.println(tmp.val);
tmp = tmp.next;
}
}
public static void main(String[] args) {
Mylink list = new Mylink();
list.addNode(3);
list.addNode(1);
list.addNode(2);
list.addNode(84);
list.addNode(45);
System.out.println("linkLength:" + list.length());
System.out.println("head.data:" + list.head.val);
list.printList();
list.deleteNode(4);
System.out.println("After deleteNode(4):");
list.printList();
}
}
下面是用数组赋值的
import java.util.Scanner;
public class Mylink {
Cur head = null; // 使用給定值初始化新節點cur
/**
* name:Mylink
* 功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
* ------------------------------------------------ --------
* 作者:lxw: 修改时间:2019年9月21日
*
*
*/
class Cur {
Cur next = null;// 將cur的next的字段链接到下一个结点
int val;//定义一个值,作为节点内容
public Cur(int data) {
this.val = data;
}
}
/**
* 功能:向链表中插入数据
*
* 参数:d
*/
public void addNode(int d) {
Cur newCur = new Cur(d);// 实例化一个节点
if (head == null) {
head = newCur;
return;
}
Cur temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newCur;
}
/**
* NAME:deleteNode
* 功能:删除第index个节点
* 参数:index
* --------------------------------
*/
public boolean deleteNode(int index) {
if (index < 1 || index > length()) {
return false;
}
if (index == 1) {
head = head.next;
return true;
}
int i = 1;
Cur preNode = head;
Cur curNode = preNode.next;
while (curNode != null) {
if (i == index) {
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return false;
}
/**
* NAME:deleteNode11
* 功能:在不知道头指针的情况下删除指定节点
* 参数:n ----------------------
*/
public boolean deleteNode11(Cur n) {
if (n == null || n.next == null) {
return false;
}
int temp = n.val;
n.val = n.next.val;
n.next.val = temp;
n.next = n.next.next;
System.out.println("删除成功!");
return true;
}
/**
* NAME:length 功能:返回节点长度
*/
public int length() {
int length = 0;
Cur tmp = head;
while (tmp != null) {
length++;
tmp = tmp.next;
}
return length;
}
public void printList() {
Cur tmp = head;
while (tmp != null) {
System.out.println(tmp.val);
tmp = tmp.next;
}
}
public static void main(String[] args) {
Mylink list = new Mylink();
System.out.println("Tell me 10 figures:" );
int arr[] = new int[10];
Scanner cur = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
arr[i] = cur.nextInt();
list.addNode(arr[i]);
}
System.out.println("linkLength:" + list.length());
System.out.println("head.data:" + list.head.val);
list.printList();
list.deleteNode(4);
System.out.println("After deleteNode(4):");
list.printList();
}
}
好了,今日学习就是java链表了,明儿还得看看c语言的链表。
我觉得,目前这是我理解到的所有链表知识,我还会继续学习链表,也会继续更新链表,争取早点可以了解完整整个链表吧