自己实现Single LinkedList

Posted 太空工程车

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己实现Single LinkedList相关的知识,希望对你有一定的参考价值。

My_Single_LinkedList

分4个部分实现(CRUD - 增删改查)。

首先要有一个Node(节点类)

1     class Node {
2         public int val;
3         public Node next;
4 
5         public Node(int val) {
6             this.val = val;
7             this.next = null;
8         }
9     }

instance variables and constructer - 成员变量和构造函数

1     public Node head; //头指针指向虚拟的node,真正的list是取head.next
2     public Node last; //尾指针指向最后一个元素
3     public int length; //list的长度,不是index。在insert的时候,判断insert的index
4 
5     public My_Single_LinkedList() {
6         this.head = new Node(-1);
7         this.last = head;
8         this.length = 0;
9     }

1. 添加

  添加部分有两大部分,一个是添加在头和尾,一个是添加在某个index的左和右

  添加的同时要保持length和last指针的更新

  1) 添加在头和尾:O(1)的时间复杂度

 1     public void addLast(int val) {
 2         last.next = new Node(val);
 3         last = last.next;
 4         this.length++;
 5     }
 6 
 7     public void addFirst(int val) {
 8         Node newNode = new Node(val);
 9         newNode.next = head.next;
10         head.next = newNode;
11         this.length++;
12     }

  2) 在某个index的左和右添加:O(n)时间复杂度

 1     /**
 2      * insert before index
 3      * @param val
 4      * @param index
 5      */
 6     public void insertBefore(int val, int index) {
 7         if (index <= 0) { //在0之前加,相当于addFirst
 8             addFirst(val);
 9             return;
10         }
11         if (index >= length) {//在超出length之前加,相当于addLast
12             addLast(val);
13             return;
14         }
15         // 普通情况,两个指针,一前一后
16         Node cur = head.next;
17         Node prev = head;
18         int counter = 0;
19         while (cur != null && counter < index) {
20             cur = cur.next;
21             prev = prev.next;
22             counter++;
23         }
24         Node newNode = new Node(val);
25         newNode.next = cur;
26         prev.next = newNode;
27         this.length++;
28     }
29 
30     /**
31      * insert after index
32      * @param val
33      * @param index certain index you want to insert at
34      */
35     public void insertAfter(int val, int index) {
36         if (index < 0) {
37             addFirst(val);
38             return;
39         }
40         if (index >= length - 1) {
41             addLast(val);
42             return;
43         }
44         Node cur = head.next;
45         int counter = 0;
46         while (cur != null && counter < index) {
47             cur = cur.next;
48             counter++;
49         }
50         Node newNode = new Node(val);
51         newNode.next = cur.next;
52         cur.next = newNode;
53         this.length++;
54     }

2. 更新:O(n)时间复杂度

 1     public void updateAt(int val, int index) {
 2         if (index < 0 || index > length - 1) {
 3             return;
 4         }
 5         int counter = 0;
 6         Node cur = head.next;
 7         while (cur != null && counter < index) {
 8             cur = cur.next;
 9             counter++;
10         }
11         cur.val = val;
12     }

3. 删除:O(n)时间复杂度

删除的时候也要注意length和last的更新

 1     public void deleteAt(int index) {
 2         if (index < 0 || index > length - 1) {
 3             return;
 4         }
 5         int counter = 0;
 6         Node prev = head;
 7         Node cur = head.next;
 8         while (cur != null && counter < index) {
 9             cur = cur.next;
10             prev = prev.next;
11             counter++;
12         }
13         prev.next = prev.next.next;
14         //更新length和last指针
15         length--;
16         while (prev.next != null) {
17             prev = prev.next;
18         }
19         this.last = prev;
20     }

4. 搜索:O(n)时间复杂度

 1     /**
 2      * 根据val搜索
 3      * 返回第一个符合条件node的index
 4      * 如果没有,返回-1
 5      */
 6     public int getByValue(int val) {
 7         Node cur = head.next;
 8         int index = 0;
 9 
10         while (cur != null) {
11             if (cur.val == val) {
12                 return index;
13             }
14             cur = cur.next;
15             index++;
16         }
17         return -1;
18     }
19 
20     /**
21      * 根据index搜索
22      */
23     public Node get(int index) {
24         if (index < 0 || index > length - 1) {
25             return null;
26         }
27         Node cur = head.next;
28         int counter = 0;
29         while (cur != null && counter < index) {
30             cur = cur.next;
31             counter++;
32         }
33         return cur;
34     }

完整代码:

  1 /**
  2  * Created by Mingxiao on 9/5/2016.
  3  */
  4 public class My_Single_LinkedList {
  5 
  6     class Node {
  7         public int val;
  8         public Node next;
  9 
 10         public Node(int val) {
 11             this.val = val;
 12             this.next = null;
 13         }
 14     }
 15 
 16     public Node head; //头指针指向虚拟的node,真正的list是取head.next
 17     public Node last; //尾指针指向最后一个元素
 18     public int length; //list的长度,不是index。在insert的时候,判断insert的index
 19 
 20     public My_Single_LinkedList() {
 21         this.head = new Node(-1);
 22         this.last = head;
 23         this.length = 0;
 24     }
 25 // =============== INSERT==========================
 26     public void addLast(int val) {
 27         last.next = new Node(val);
 28         last = last.next;
 29         this.length++;
 30     }
 31 
 32     public void addFirst(int val) {
 33         Node newNode = new Node(val);
 34         newNode.next = head.next;
 35         head.next = newNode;
 36         this.length++;
 37     }
 38 
 39     /**
 40      * insert before index
 41      * @param val
 42      * @param index
 43      */
 44     public void insertBefore(int val, int index) {
 45         if (index <= 0) { //在0之前加,相当于addFirst
 46             addFirst(val);
 47             return;
 48         }
 49         if (index >= length) {//在超出length之前加,相当于addLast
 50             addLast(val);
 51             return;
 52         }
 53         // 普通情况,两个指针,一前一后
 54         Node cur = head.next;
 55         Node prev = head;
 56         int counter = 0;
 57         while (cur != null && counter < index) {
 58             cur = cur.next;
 59             prev = prev.next;
 60             counter++;
 61         }
 62         Node newNode = new Node(val);
 63         newNode.next = cur;
 64         prev.next = newNode;
 65         this.length++;
 66     }
 67 
 68     /**
 69      * insert after index
 70      * @param val
 71      * @param index certain index you want to insert at
 72      */
 73     public void insertAfter(int val, int index) {
 74         if (index < 0) {
 75             addFirst(val);
 76             return;
 77         }
 78         if (index >= length - 1) {
 79             addLast(val);
 80             return;
 81         }
 82         Node cur = head.next;
 83         int counter = 0;
 84         while (cur != null && counter < index) {
 85             cur = cur.next;
 86             counter++;
 87         }
 88         Node newNode = new Node(val);
 89         newNode.next = cur.next;
 90         cur.next = newNode;
 91         this.length++;
 92     }
 93 
 94 //===================update=========================
 95     public void updateAt(int val, int index) {
 96         if (index < 0 || index > length - 1) {
 97             return;
 98         }
 99         int counter = 0;
100         Node cur = head.next;
101         while (cur != null && counter < index) {
102             cur = cur.next;
103             counter++;
104         }
105         cur.val = val;
106     }
107 //=====================delete=======================
108     public void deleteAt(int index) {
109         if (index < 0 || index > length - 1) {
110             return;
111         }
112         int counter = 0;
113         Node prev = head;
114         Node cur = head.next;
115         while (cur != null && counter < index) {
116             cur = cur.next;
117             prev = prev.next;
118             counter++;
119         }
120         prev.next = prev.next.next;
121         //更新length和last指针
122         length--;
123         while (prev.next != null) {
124             prev = prev.next;
125         }
126         this.last = prev;
127     }
128 //===================search================================
129 
130     /**
131      * 根据val搜索
132      * 返回第一个符合条件node的index
133      * 如果没有,返回-1
134      */
135     public int getByValue(int val) {
136         Node cur = head.next;
137         int index = 0;
138 
139         while (cur != null) {
140             if (cur.val == val) {
141                 return index;
142             }
143             cur = cur.next;
144             index++;
145         }
146         return -1;
147     }
148 
149     /**
150      * 根据index搜索
151      */
152     public Node get(int index) {
153         if (index < 0 || index > length - 1) {
154             return null;
155         }
156         Node cur = head.next;
157         int counter = 0;
158         while (cur != null && counter < index) {
159             cur = cur.next;
160             counter++;
161         }
162         return cur;
163     }
164 
165     public void print() {
166         if (head.next == null) {
167             System.out.println("null");
168             return;
169         }
170         Node cur = head.next;
171         while (cur.next != null) {
172             System.out.print(cur.val + "->");
173             cur = cur.next;
174         }
175         System.out.println(cur.val);
176     }
177 
178 
179     public static void main(String[] args) {
180         My_Single_LinkedList list = new My_Single_LinkedList();
181         list.addLast(1);
182         list.addLast(2);
183         list.addLast(0);
184         list.insertAfter(5,0);
185         list.updateAt(9, 1);
186         list.deleteAt(2);
187         System.out.println(list.get(2).val);
188         list.print();
189     }
190 }

 

以上是关于自己实现Single LinkedList的主要内容,如果未能解决你的问题,请参考以下文章

JAVA自己实现LinkedList

自己实现LinkedList

自己实现数据结构---LinkedList

自己实现Linkedlist,实现其常用的增删查的方法

自己实现简单的linkedlist 没有迭代器

12mmaction2 行为识别商用级别X3D复现 demo实现 检测自己的视频 Expanding Architecturesfor Efficient Video Recognition(代码片段