链表

单链表

单链表图示:


单链表的基础操作

具体实现功能:

1. 添加节点(将指针不停指向下一个 判空) 
2. 查询下一个节点(返回this.next) 
3. 获取当前节点数据(返回this.data) 
4. 判断是不是最后一个节点(只需要返回next是不是为空)

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Node {
//节点内容
int data;

//下一个节点
Node next;

public Node(int data){
this.data=data;
}

//追加节点
public Node append(Node node){
//当前节点
Node currentNode =this;
while(true){
//取出下一个节点赋给上一个节点
Node nextNode=currentNode.next;
if(nextNode==null)
{
break; //下一个为空就跳出
}
currentNode=nextNode; //将当前指针挪到下一个
}
//把想要追加的追加上去(上面循环已经肯定是到最后一个节点了)
currentNode.next=node;

return this; //可不停地追加 n1.append(n2).append(3)...
}

//获取下一个节点
public Node next(){
return this.next; //返回next
}

//获取数据
public int getData(){
return this.data; //获取数据
}

//判断是否是最后一个
public boolean isLast(){
return next==null;
}
}

测试Test类

1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
public static void main(String[] args){
//创建节点
Node n1=new Node(1);
Node n2=new Node(2);
Node n3=new Node(3);
n1.append(n2).append(n3).append(new Node(4)); // 1 --> 2 --> 3 --> 4

System.out.println(n1.next().next().next().getData()); //数据是4的节点
System.out.println(n1.next().next().next().isLast()); //判断数据是4的节点是不是最后一个
}
}

测试结果:


单链表删除节点(让下下一个节点连到本节点)

1
2
3
4
5
6
7
//删除节点
public void removeNext(){
//获取下下一个节点
Node newNext= next.next;
//下下一个节点直接给这个节点(直接把下一个节点删除)
this.next=newNext;
}

单链表插入节点(先管卸下去的节点然后再连接)

方法实现解释:

1
2
3
4
5
假设现在是 1 --> 2 --> 3 --> 4  我们想把5插入到2后面
具体实现:
1. 将原来的下一个节点3先存到一个变量节点
2. 将5连接到2后面 1 --> 2 --> 5 || 3 --> 4
3. 现在5已经替换了3的位置 把存3的那个变量节点连到5后面 1 --> 2 --> 5 --> 3 --> 4

方式实现

1
2
3
4
5
6
7
8
9
10

//插入节点(先将旧的插到新的上面 新的在插到要插的位置)
public void after(Node node){
//获取下一个节点为下下一个节点
Node nextNext=next; //现在的这个下一个节点存到一个叫nextNext的节点
//新加入的节点成为这个节点的下一个节点
this.next=node;
//插入的节点后面把存的那个节点接上去
node.next=nextNext;
}

测试Test类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public static void main(String[] args){
//创建节点
Node n1=new Node(1);
Node n2=new Node(2);
Node n3=new Node(3);
n1.append(n2).append(n3).append(new Node(4)); // 1 --> 2 --> 3 --> 4

Node n5=new Node(5); //要插入的n5节点
n1.next().after(n5); //插入到n2的后面 n1.next()就是n2
n1.show(); //展示所有节点

}
}

插入n5在n2后面:


循环链表

循环链表图示:

方法实现(下一个节点指向当前节点)

对比单链表: 最后一个的next要指向开头的节点

1
2
//下一个节点
LoopNode next=this;

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class LoopNode {
//节点内容
int data;

//下一个节点
LoopNode next=this;

public LoopNode(int data){
this.data=data;
}

//获取下一个节点
public LoopNode next(){
return this.next; //返回next
}

//获取数据
public int getData(){
return this.data; //获取数据
}

//判断是否是最后一个
public boolean isLast(){
return next==null;
}

//删除节点
public void removeNext(){
//获取下下一个节点
LoopNode newNext= next.next;
//下下一个节点直接给这个节点(直接把下一个节点删除)
this.next=newNext;
}


//插入节点(先将旧的插到新的上面 新的在插到要插的位置)
public void after(LoopNode node){
//获取下一个节点为下下一个节点
LoopNode nextNext=next; //下一个节点给下下一个节点
//新加入的节点成为这个节点的下一个节点
this.next=node;
//下下一个节点成为新节点的下一个节点
node.next=nextNext;
}


}

测试Test类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
public static void main(String[] args){
//创建节点
LoopNode n1=new LoopNode(1);
LoopNode n2=new LoopNode(2);
LoopNode n3=new LoopNode(3);
LoopNode n4=new LoopNode(4);

//插入节点
n1.after(n2); //现在只有 1 --> 2
n2.after(n3); //现在是 1 --> 2 -->3
System.out.println(n1.next().getData()); // 1的下一个节点的内容应该输出2
System.out.println(n2.next().getData()); // 2的下一个节点的内容应该输出3
System.out.println(n3.next().getData()); // 3的下一个节点的内容应该输出1
}
}

具体实现结果:


双向循环链表

双向循环链表图示:

方式实现

图示解释:

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class DoubleNode {
//上一个节点
DoubleNode pre=this; //一开始这个节点的前一个和后一个都是它自己!!!
//下一个节点
DoubleNode next=this;
//节点数据
int data;

public DoubleNode(int data) {
this.data=data;
}

//增加节点
public void after(DoubleNode node){
//原来的下一个节点
DoubleNode nextNext=next;
//把新节点作为当前节点的下一个节点
this.next=node;
//把当前节点作为新节点的前一个节点
node.pre=this;
//让原来的下一个节点作为新节点的下一个节点
node.next=nextNext;
//让原来的下一个节点的上一个节点作为新节点
nextNext.pre=node;
}

//下一个节点
public DoubleNode next() {
return this.next;
}

//上一个节点
public DoubleNode pre(){
return this.pre;
}

//获取数据
public int getData(){
return this.data;
}

}

测试Test类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String[] args){
//创建节点
DoubleNode n1 = new DoubleNode(1);
DoubleNode n2 = new DoubleNode(2);
DoubleNode n3 = new DoubleNode(3);
//追加节点
n1.after(n2);
n2.after(n3); // 1 2 3 循环
//查看上一个,自己,下一个节点的内容
System.out.println(n2.pre().getData()); // n2的前一个节点的数据 1
System.out.println(n2.getData()); // n2的数据 2
System.out.println(n2.next().getData()); // n2的下一个节点的数据 3
System.out.println(n3.next().getData()); // n3的下一个节点的数据 1
System.out.println(n1.pre().getData()); // n1的前一个节点的数据 3
}
}

测试代码结果:


×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 单链表
  2. 2. 单链表的基础操作
    1. 2.1. 具体实现
    2. 2.2. 测试Test类
  3. 3. 单链表删除节点(让下下一个节点连到本节点)
  4. 4. 单链表插入节点(先管卸下去的节点然后再连接)
    1. 4.1. 方式实现
    2. 4.2. 测试Test类
  5. 5. 循环链表
    1. 5.1. 方法实现(下一个节点指向当前节点)
    2. 5.2. 测试Test类
  6. 6. 双向循环链表
    1. 6.1. 方式实现
    2. 6.2. 测试Test类
,