数据结构-链表

  链表:

  简单链表:是一个非连续性的存贮结构,数据元素上的逻辑循序是通过链表上的指针按次序实现的;简单来说,就像是个火车一样,每节车厢代表一个节点,链接车厢的钩子就是所谓的指针,车厢有数据域和指针域;

  图解:指针域和数据域分别连接后一个节点;

  

  上代码:

  创建节点对象;

 1 package link;
 2 /**
 3  * 链表
 4  * @author caizhou
 5  *
 6  */
 7 public class Node {
 8     
 9     /**
10      * 链结点;
11      */
12     
13     public long data;
14     public Node next;
15     
16     
17     
18     public Node(long value){
19         data = value;
20     }
21     
22     public void display(){
23         System.out.println(data + " ");
24     }
25 }

  节点的插入,删除,显示操作;

 1 package link;
 2 
 3 public class linkList {
 4     
 5     private Node first;
 6     
 7     
 8     public linkList(){
 9         first = null;
10         
11     }
12     /**
13      * 插入节点,从头节点插入;
14      * @param value
15      */
16     public void insertFirst(long value){
17         Node me = new Node(value);
18         if(first == null){
19             first = me;
20         }else{
21             me.next = first.next;
22             first.next = me; 
23         }
24         
25     }
26     /**
27      * 删除节点,从头节点删除;
28      * @return
29      */
30     public Node deletNode(){
31         Node me = first;
32         first = me.next;
33         return me;
34         
35     }
36     
37     public void display(){
38         Node current = first;
39         while(current != null){
40             System.out.print(current.data + " ");
41             current = current.next;
42         }
43     }
44 }

  测试链表:

  

 1 package link;
 2 
 3 public class testLink {
 4     public static void main(String[] args) {
 5         
 6         linkList lik = new linkList();
 7         lik.insertFirst(23);
 8         lik.insertFirst(32);
 9         lik.insertFirst(21);
10         lik.insertFirst(26);
11         lik.insertFirst(40);
12         lik.display();
13         System.out.println();
14        
15         lik.deletNode();
16         lik.display();
17         
18     }
19 }

  显示结果:

23 40 26 21 32 
40 26 21 32

 

  双端链表和双向链表:

  双端链表:有头节点和尾节点的链表,叫做双端链表;

 

  双端链表实现插入,删除操作代码:

  

 1 package link;
 2 
 3 /**
 4  * 双端列表:有头尾节点;
 5  * @author caizhou
 6  *
 7  */
 8 public class linkLastList {
 9     
10     
11 
12     
13         
14         private Node first;
15         private Node last;
16         
17         
18         public linkLastList(){
19             first = null;
20             last = null;
21             
22         }
23         /**
24          * 从头节点插入;
25          * @param value
26          */
27         public void insertFirst(long value){
28             Node me = new Node(value);
29             if(isEmpty()){
30                 last = me;
31             }else{
32                 me.next = first;
33                 
34             }
35             first = me;
36             
37         }
38         /**
39          * 从尾节点进行插入;
40          */
41         public void insertLast(long value){
42             Node me = new Node(value);
43             if(isEmpty()){
44                 first = me;
45             }
46             else{
47                 last.next = me;
48                 
49             }
50             last = me;
51         }
52         /**
53          * 删除头节点;
54          * @return
55          */
56         public Node deleteFirstNode(){
57             Node me = first;
58             if(first == null ){
59                 last = null;
60             }else{
61                 first = me.next;
62             }
63             
64             return me;
65             
66         }
67         
68         
69         public void display(){
70             Node current = first;
71             while(current != null){
72                 System.out.print(current.data + " ");
73                 current = current.next;
74             }
75         }
76         public Boolean isEmpty(){
77             return (first == null);
78         }
79     }

 

 

 测试双端链表:
 

 1 package link;
 2 
 3 public class testLink {
 4     public static void main(String[] args) {
 5         
 6         linkLastList lik = new linkLastList();
 7         lik.insertFirst(23);
 8         lik.insertFirst(32);
 9         lik.insertFirst(21);
10         lik.insertFirst(26);
11         lik.insertFirst(40);
12         lik.display();
13         System.out.println();
14         
15         lik.deleteFirstNode();
16         lik.display();
17         
18     }
19 }

 

 

  测试结果:

40 26 21 32 
26 21 32 

  双向链表:指的是每个车厢节点除了包含对下一节车厢的引用,还包含对上一节车厢的引用;

   创建双向链表的next和privous;

  

 1 package link;
 2 
 3 public class DoubleNode {
 4 
 5     /**
 6      * 链结点;
 7      */
 8     
 9     public long data;
10     public DoubleNode next;
11     public DoubleNode privous;
12     
13     
14     
15     public DoubleNode(long value){
16         data = value;
17     }
18     
19     public void display(){
20         System.out.println(data + " ");
21     }
22 }

 

  双向链表的插入规则:从头节点插入,如果头节点为空,则设置插入节点为尾节点,如果不为空,那么头节点的privous指向要插入的节点,要插入的节点的next指向头节点,新的头节点指向新插入的节点;从尾节点插入,同样判断如果first节点为空,则设置插入节点为头节点,如果不为空,那么设置尾节点的next为要插入的节点,同时设置插入节点的privous为尾节点,新的尾节点指向新插入的节点;

  图解操作:我觉得这张图应该很好理解了;

  

 

  直接上代码:

 

  

 1 package link;
 2 
 3 import javax.swing.border.EmptyBorder;
 4 
 5 /**
 6  * 双向列表:除了对有下一个节点的引用,也有对前一个结点的引用;
 7  * @author caizhou
 8  *
 9  */
10 public class DoubleLinkList {
11     
12     
13     private DoubleNode first;
14     private DoubleNode last;
15     
16     public DoubleLinkList(){
17         
18         first = null;
19         last = null;
20     }
21     /**
22      * 插入链表;从头节点插入;
23      */
24     public void insertfirst(long value ){
25         
26         DoubleNode me = new DoubleNode(value);
27         if(Empty()){
28             last = me;
29         }else{
30             first.privous = me;
31             me.next = first;
32         }
33         
34         first = me;
35     }
36     /*
37      * 插入一个节点,从尾节点插入;后一个节点指向插入节点,同时设置插入节点的privous指向前一个节点
38      */
39     public void insertLast(long value){
40         DoubleNode me = new DoubleNode(value);
41         if(Empty()){
42             first = me;
43         }else{
44             last.next = me;
45             me.privous = last;
46         }
47         last = me;
48     }
49     
50     public void display(){
51         DoubleNode current = first;
52         while(current != null){
53             System.out.print(current.data + " ");
54             current = current.next;
55         }
56     }
57     public boolean Empty(){
58         return (first == null);
59     }
60 }

   测试双向链表的插入操作:

  

 1 package link;
 2 
 3 public class testDoubleLink {
 4     
 5     public static void main(String[] args) {
 6         DoubleLinkList li = new DoubleLinkList();
 7         li.insertLast(23);
 8         li.insertLast(32);
 9         li.insertLast(34);
10         li.insertLast(15);
11         li.display();
12     }
13 }

  测试结果:

  

23 32 34 15 

  从头节点插入也是一样,直接测试即可;

  双向链表的删除操作:从头节点删除,同样是判断节点是否为空,如果为空则设置尾节点为null,如果不为空,则设置头节点的next的privous为null,然后新的头节点指向当前删除节点的下一个节点,则表示删除成功;从尾节点删除,同样是判断头节点是否为空,如果为空,则设置尾节点为null,如果不为空,则设置尾节点的privous的next为null,同时把新的尾节点设置成尾节点的next;

  图解删除操作:

  

 

 

 

  直接上代码:

  

 1 package link;
 2 
 3 import javax.swing.border.EmptyBorder;
 4 
 5 /**
 6  * 双向列表:除了对有下一个节点的引用,也有对前一个结点的引用;
 7  * @author caizhou
 8  *
 9  */
10 public class DoubleLinkList {
11     
12     
13     private DoubleNode first;
14     private DoubleNode last;
15     
16     public DoubleLinkList(){
17         
18         first = null;
19         last = null;
20     }
21         /*
22      * 从头节点删除;
23      */
24     public DoubleNode deleteFirst(){
25         DoubleNode me = first;
26         if(first.next == null){
27             last = null;
28         }else{
29             first.next.privous = me;
30         }
31         first = me.next;
32         return me;
33     }
34 public DoubleNode deleteLast(){ 35 DoubleNode me = last; 36 if(first.next == null){ 37 last = null; 38 }else{ 39 last.privous.next = null; 40 } 41 last = me.privous; 42 return me; 43 } 44 45 public void display(){ 46 DoubleNode current = first; 47 while(current != null){ 48 System.out.print(current.data + " "); 49 current = current.next; 50 } 51 } 52 public boolean Empty(){ 53 return (first == null); 54 } 55 } 56

  测试代码:

  

 1 package link;
 2 
 3 public class testDoubleLink {
 4     
 5     public static void main(String[] args) {
 6         DoubleLinkList li = new DoubleLinkList();
 7 
 8         li.insertLast(23);
 9         li.insertLast(32);
10         li.insertLast(34);
11         li.insertLast(15);
12         li.display();
13         System.out.println();
14         li.deleteFirst();
15         li.display();
16     }
17 }

  测试结果:

23 32 34 15 
32 34 15 

  至此,链表的基本应用已经讲完了,希望能够帮到你,谢谢!

  

 

  

 

 

 

  

 

 

   

posted on 2020-03-31 21:01  学弟1  阅读(211)  评论(0编辑  收藏  举报

导航