实现LinkedList

数据存储在节点中

1
2
3
4
class Node {
E e;
Node 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class LinkedList<E> {
// 设计成内部类的形式,对外部是透明的
private class Node {
public E e;
public Node next;

public Node(E e,Node next) {
this.e = e;
this.next = next;
}
public Node(E e) {
this(e,null);
}
public Node() {
this(null,null);
}
public String toString() {
return e.toString();
}
}

private Node head;
private int size;

public LinkedList() {
this.head = null;
this.size = 0;
}
// 获取链表中元素的个数
public int getSize() {
return size;
}
// 判断链表是否为空
public boolean isEmpty() {
return size == 0;
}
// 在链表头添加元素,与其他元素不同
public void addFirst(E e) {
// Node node = new Node(e);
// node.next = head;
// head = node;
head = new Node(e,head);
size ++;
}

public void add(int index, E e) {
if(index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index is error");
}

if(index == 0) {
// 在头部添加节点
addFirst(e);
} else {
Node prev = head;
for(int i = 0; i < index - 1; i++) {
prev = prev.next();
}
// Node node = new Node(e);
// node.next = prev.next;
// prev.next = node;
prev.next = new Node(e,prev.next);
size ++;
}
}
// 在链表末尾添加元素
public void addLast(E e){
add(size,e);
}
}

虚拟节点

  • 解决头节点插入与其他节点插入方法不同的问题
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
public class LinkList<E> {

// 设计成内部类的形式,对外部是透明的
private class Node {
public E e;
public Node next;

public Node(E e, Node next) {
this.e = e;
this.next = next;
}

public Node(E e) {
this(e, null);
}

public Node() {
this(null, null);
}

@Override
public String toString() {
return e.toString();
}
}
// 虚拟头节点
private Node dummyHead;
private int size;

public LinkList() {
this.dummyHead = new Node(null, null);
this.size = 0;
}

// 获取链表中元素的个数
public int getSize() {
return size;
}

// 判断链表是否为空
public boolean isEmpty() {
return size == 0;
}

public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index is error");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = new Node(e,prev.next);
size++;
}

// 在链表末尾添加元素
public void addLast(E e) {
add(size, e);
}

// 在链表头添加元素
public void addFirst(E e) {
add(0,e);
}

// 获取链表的index的值
public E get(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index is error");
}
Node cur = dummyHead.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
return cur.e;
}

// 获得链表的第一个元素
public E getFirst() {
return get(0);
}

// 获得链表的最后一个元素
public E getLast() {
return get(size - 1);
}

// 更新链表的最后一个元素
public void set(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index is error");
}
Node cur = dummyHead;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
cur.e = e;
}

// 查找链表是否存在元素e
public boolean contains(E e) {
Node cur = dummyHead.next;
while (cur != null) {
if (cur.e.equals(e)) {
return true;
}
}
return false;
}

// 删除指定元素
public E remove(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index is error");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
size--;
return delNode.e;
}

// 删除第一个元素
public E removeFirst() {
return remove(0);
}

// 删除最后一个元素
public E removeLast() {
return remove(size - 1);
}

@Override
public String toString() {
StringBuilder res = new StringBuilder();
// Node cur = dummyHead.next;
// while(cur != null) {
// res.append(cur + "->");
// cur = cur.next;
// }
for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
res.append(cur + "->");
}
res.append("NULL");
return res.toString();
}
}
-------------本文结束感谢您的阅读-------------