基本概念
我的理解就是这个链表就像是几个人手拉手,我们只知道第一个认识谁,只能通过上一个拉手的人,才能知道这个是谁。
注 Node 里面存放的是 你存放的值的地址,只有修改在class Node里面被赋值的 Node 类型 的值才算是修改链表,其他任何在这之外赋值的,都只是被赋值,无法对链表起到任何作用
代码如下
class LinkedList1 {
Node head;
class Node {// 节点
public String value = null;
public Node next = null;
public Node(String value) {
super();
this.value = value;
}
}
public void add(String v) {// 链表的添加
Node n = new Node(v);
if (head == null) {
head = n;
return;
}
Node cun = head;
while (cun.next != null) {
cun = cun.next;
}
cun.next = n;
}
public int length() {// 链表的长度
int i = 0;
if (head != null) {
i++;
}
Node cun = head.next;
while (cun != null) {
i++;
cun = cun.next;
}
return i;
}
public void println() {// 遍历
if (head.equals(null)) {
System.out.println("还没存数据");
return;
}
Node cun = head;
while (cun != null) {
System.out.println(cun.value);
cun = cun.next;
}
}
public void delete(String s) {// 链表的删除,删除所有等于 s 的值
int i = 0;
if (head == null) {
System.out.println("还未存入数据");
return;
}
boolean pd = false;// 判断是否进行过删除
while ((head != null && head.value.equals(s))) {// 当第一个是要删除的值,删除之后,会在次循环判断是否这个首节点是否是要删除的
if (head.next == null) {// 判断是否是进行到了最后一个节点
head = null;
} else {
head = head.next;
}
pd = true;
}
Node cun = head;
level: while (head != null && cun.next != null) {
while (cun.next.value.equals(s) && cun.next != null) {
pd = true;
if (cun.next.next != null) {
cun.next = cun.next.next;
} else {
cun.next = null;
break level;
}
}
cun = cun.next;
}
if (head != null) {
System.out.println(pd ? "删除完成" : "未找到改数据");
} else {
System.out.println("数据已删完");
return;
}
println();
}
public void remove(String s) {// 链表的移除第一个碰到的
boolean pd = false;// 判断是否进行过删除
if (head == null) {
System.out.println("还未存入数据");
return;
}
if (head.value.equals(s)) {// 判断是否是要删的值
if (head.next == null) {// 判断是否是最后一个节点
head = null;
} else {
head = head.next;
}
pd = true;
}
Node cun = head;
while (cun.next != null) {
if (cun.next.value.equals(s)) {
pd = true;
if (cun.next.next != null) {
cun.next = cun.next.next;
cun = cun.next;
} else {
cun.next = null;
}
break;
}
cun = cun.next;
}
if (head == null) {
System.out.println("数据已删完");
} else {
System.out.println(pd ? "删除完成" : "未找到改数据");
println();
}
}
public void Reverse() {// 链表的逆序
if (head == null) {
System.out.println("暂无数据");
}
Node cun = head;
Node tmp = null;
Node foot = null;
Node rnext = null;
while (cun != null) {// 这个节点 指的是 循环到的节点
rnext = cun.next;// 这个节点的下一个节点的地址赋值给rnext
cun.next = tmp;// 这个节点的下一个节点 被 tmp 赋值
tmp = cun; // 这个节点的地址赋值给 tmp 通过循环传递,成为下一个循环的上一个节点的地址
cun = rnext;// 这个节点的下一个节点的地址赋值给这一个节点,并通过循环传递成为下一个循环的这个节点
if (cun == null) {// 当这个循环进行到最后,这个节点为空时, 第一个节点 被 赋值
head = tmp;
}
}
System.out.println("逆序完成:");
println();
}
public void modify(int index, String s){
if(index < 1 || index > length()){
System.out.println("修改的的位置错误");
return;
}
int max = length();
Node cun = head;
for(int i = 1; i <= max; i++){
if(i == index){
cun.value = s;
break;
}
cun = cun.next;
}
System.out.println("修改如下:");
println();
}
public String get(int index){//查询
if(index < 1 || index > length()){
System.out.println("该位置错误");
return null;
}
int max = length();
Node cun = head;
for(int i = 1; i <= max; i++){
if(i == index){
return cun.value;
}
cun = cun.next;
}
return null;
}
}
public class Demo02 {
public static void main(String[] args) {
LinkedList1 l = new LinkedList1();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
l.add("5");
l.println();
System.out.println();
l.Reverse();
System.out.println();
System.out.println(l.length());
System.out.println();
l.remove("1");
l.modify(2, "9");
System.out.println("查询的值:"+l.get(3));
}
}