Task01
问题:双线链表实现线性表
双线链表实现的线性表中的, 根据内容的查找修改以及根据下标的查找和修改方法
代码
package ds.day02.Task01;
public class DemoLinkList {
public static void main(String[] args) {
MyDBLinkedList<String> list = new MyDBLinkedList<>();
list.add("zs");
list.add("ls");
list.add("ww");
list.add("zl");
}
}
class MyDBLinkedList<T> {
Node head;
Node end;
int size;
public boolean add(T value) {
if (isEmpty()) {
head = new Node(value, null, null);
end = head;
size++;
return true;
}
end.next = new Node(value, end, null);
end = end.next;
size++;
return true;
}
//根据内容查找
public boolean contains(T value) {
if (value == null) {
if (isEmpty()) {
throw new RuntimeException("list is empty");
} else {
Node mid = head;
while (mid != null && value != mid.value) {
mid = mid.next;
}
if (mid == null) {
return false;
} else {
return true;
}
}
} else {
if (isEmpty()) throw new RuntimeException("list is empty");
Node mid = head;
while (mid != null && !value.equals(mid.value)) {
mid = mid.next;
}
if (mid == null) return false;
return true;
}
}
//根据下标查找
public T get(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index is Illegal ");
} else {
int tag;
Node mid;
if (index < size / 2) {
tag = 0;
mid = head;
while (mid != null && tag != index) {
tag++;
mid = mid.next;
}
} else {
tag = size - 1;
mid = end;
while (mid != null && tag != index) {
tag--;
mid = mid.pre;
}
}
return mid.value;
}
}
//根据内容修改
public boolean set(T oldValue, T newValue) {
if (oldValue == null) {
if (isEmpty()) {
throw new RuntimeException("list is empty");
} else {
Node mid = head;
while (mid != null && oldValue != mid.value) {
mid = mid.next;
}
if (mid == null) {
return false;
} else {
mid.value = newValue;
return true;
}
}
} else {
if (isEmpty()) {
throw new RuntimeException("list is empty");
} else {
Node mid = head;
while (mid != null && !oldValue.equals(mid.value)) {
mid = mid.next;
}
if (mid == null) {
return false;
} else {
mid.value = newValue;
return true;
}
}
}
}
//根据下标修改
public T set(int index, T newValue) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index is Illegal ");
} else {
int tag;
Node mid;
if (index < size / 2) {
tag = 0;
mid = head;
while (mid != null && tag != index) {
tag++;
mid = mid.next;
}
} else {
tag = size - 1;
mid = end;
while (mid != null && tag != index) {
tag--;
mid = mid.pre;
}
}
T oldValue = mid.value;
mid.value = newValue;
return oldValue;
}
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
class Node {
T value;
Node pre;
Node next;
public Node(T value, Node pre, Node next) {
this.value = value;
this.pre = pre;
this.next = next;
}
}
}