自定义一个链表,体会底层原理
基础结构
public class JtLinkedList01 {
private Node first;
private Node last;
private int size;
//[]
//["a","b","c"]
public void add(Object object){
Node node = new Node(object);
if (first==null){
// node.previous =null;
// node.next = null;
first = node;
last = node;
}else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("[");
Node temp = first;
while (temp!=null){
stringBuilder.append(temp.element+",");
temp = temp.next;
}
stringBuilder.setCharAt(stringBuilder.length()-1,']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtLinkedList01 jtLinkedList01 = new JtLinkedList01();
jtLinkedList01.add("a");
jtLinkedList01.add("b");
jtLinkedList01.add("c");
jtLinkedList01.add("c");
jtLinkedList01.add("c");
jtLinkedList01.add("c");
System.out.println(jtLinkedList01);
}
}
增加get方法
public class JtLinkedList02 {
private Node first;
private Node last;
private int size;
public Object get(int index){
if (index <0||index>size-1){
throw new RuntimeException("索引数字不合法"+index);
}
Node temp = null;
if (index<=(size>>1)){ //size>>1相当于除以2
temp = first;
for (int i = 0;i<index;i++){
temp = temp.next;
}
}else {
temp = last;
for (int i = size-1;i >index;i-- ){
temp = temp.previous;
}
}
return temp.element;
}
//[]
//["a","b","c"]
public void add(Object object){
Node node = new Node(object);
if (first==null){
// node.previous =null;
// node.next = null;
first = node;
last = node;
}else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("[");
Node temp = first;
while (temp!=null){
stringBuilder.append(temp.element+",");
temp = temp.next;
}
stringBuilder.setCharAt(stringBuilder.length()-1,']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtLinkedList02 jtLinkedList02 = new JtLinkedList02();
jtLinkedList02.add("a");
jtLinkedList02.add("b");
jtLinkedList02.add("c");
jtLinkedList02.add("d");
jtLinkedList02.add("e");
jtLinkedList02.add("f");
System.out.println(jtLinkedList02);
System.out.println(jtLinkedList02.get(1));
}
}
增加remove方法
public class JtLinkedList03 {
private Node first;
private Node last;
private int size;
public void remove(int index) {
Node temp = getNode(index);
if (temp != null) {
Node up = temp.previous;
Node down = temp.next;
if (up != null) {
up.next = down;
}
if (down != null) {
down.previous = up;
}
//被删除的元素是第一个
if (index==0){
first = down;
}
//被删除的元素是最后一个
if (index==size-1){
last = up;
}
size--;
}
}
public Object get(int index){
if (index <0||index>size-1){
throw new RuntimeException("索引数字不合法"+index);
}
Node temp = getNode(index);
return temp!=null?temp.element:null;
}
public Node getNode(int index){
Node temp = null;
if (index<=(size>>1)){ //size>>1相当于除以2
temp = first;
for (int i = 0;i<index;i++){
temp = temp.next;
}
}else {
temp = last;
for (int i = size-1;i >index;i-- ){
temp = temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(Object object){
Node node = new Node(object);
if (first==null){
// node.previous =null;
// node.next = null;
first = node;
last = node;
}else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("[");
Node temp = first;
while (temp!=null){
stringBuilder.append(temp.element+",");
temp = temp.next;
}
stringBuilder.setCharAt(stringBuilder.length()-1,']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtLinkedList03 jtLinkedList03 = new JtLinkedList03();
jtLinkedList03.add("a");
jtLinkedList03.add("b");
jtLinkedList03.add("c");
jtLinkedList03.add("d");
jtLinkedList03.add("e");
jtLinkedList03.add("f");
System.out.println(jtLinkedList03);
jtLinkedList03.remove(3);
System.out.println(jtLinkedList03);
System.out.println(jtLinkedList03.get(1));
jtLinkedList03.remove(0);
System.out.println(jtLinkedList03);
jtLinkedList03.remove(3);
System.out.println(jtLinkedList03);
}
}
插入节点
public class JtLinkedList04 {
private Node first;
private Node last;
private int size;
public void add(int index, Object object) {
Node temp = getNode(index);
Node newNode = new Node(object);
Node up = temp.previous;
if (temp != null) {
if (0<index&&index<size-1) {
up.next = newNode;
newNode.previous = up;
newNode.next = temp;
temp.previous = newNode;
}
if (index == 0) {
first = newNode;
newNode.previous = null;
newNode.next = temp;
temp.previous = newNode;
}
if (index == size-1){
last = newNode;
newNode.previous = temp.next;
newNode.next = null;
temp.next = newNode;
}
if (index<0||index>size){
throw new RuntimeException("索引数字不合法"+index);
}
size++;
}
}
public void remove(int index) {
Node temp = getNode(index);
if (temp != null) {
Node up = temp.previous;
Node down = temp.next;
if (up != null) {
up.next = down;
}
if (down != null) {
down.previous = up;
}
//被删除的元素是第一个
if (index == 0) {
first = down;
}
//被删除的元素是最后一个
if (index == size - 1) {
last = up;
}
size--;
}
}
public Object get(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException("索引数字不合法" + index);
}
Node temp = getNode(index);
return temp != null ? temp.element : null;
}
public Node getNode(int index) {
Node temp = null;
if (index <= (size >> 1)) { //size>>1相当于除以2
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
} else {
temp = last;
for (int i = size - 1; i > index; i--) {
temp = temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(Object object) {
Node node = new Node(object);
if (first == null) {
// node.previous =null;
// node.next = null;
first = node;
last = node;
} else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("[");
Node temp = first;
while (temp != null) {
stringBuilder.append(temp.element + ",");
temp = temp.next;
}
stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtLinkedList04 jtLinkedList04 = new JtLinkedList04();
jtLinkedList04.add("a");
jtLinkedList04.add("b");
jtLinkedList04.add("c");
jtLinkedList04.add("d");
jtLinkedList04.add("e");
jtLinkedList04.add("f");
System.out.println(jtLinkedList04);
jtLinkedList04.remove(3);
System.out.println(jtLinkedList04);
System.out.println(jtLinkedList04.get(1));
jtLinkedList04.remove(0);
System.out.println(jtLinkedList04);
jtLinkedList04.remove(3);
System.out.println(jtLinkedList04);
jtLinkedList04.add(0, false);
System.out.println(jtLinkedList04);
jtLinkedList04.add(0,false);
System.out.println(jtLinkedList04);
jtLinkedList04.add(4,4);
System.out.println(jtLinkedList04);
jtLinkedList04.add(5,5);
System.out.println(jtLinkedList04);
}
}
增加小的封装增加泛型
public class JtLinkedList05 <E>{
private Node first;
private Node last;
private int size;
public void add(int index, E element) {
checkRange(index);
Node temp = getNode(index);
Node newNode = new Node(element);
Node up = temp.previous;
if (temp != null) {
if (0 < index && index < size - 1) {
up.next = newNode;
newNode.previous = up;
newNode.next = temp;
temp.previous = newNode;
}
if (index == 0) {
first = newNode;
newNode.previous = null;
newNode.next = temp;
temp.previous = newNode;
}
if (index == size - 1) {
last = newNode;
newNode.previous = temp.next;
newNode.next = null;
temp.next = newNode;
}
size++;
}
}
public void remove(int index) {
checkRange(index);
Node temp = getNode(index);
if (temp != null) {
Node up = temp.previous;
Node down = temp.next;
if (up != null) {
up.next = down;
}
if (down != null) {
down.previous = up;
}
//被删除的元素是第一个
if (index == 0) {
first = down;
}
//被删除的元素是最后一个
if (index == size - 1) {
last = up;
}
size--;
}
}
public E get(int index) {
checkRange(index);
Node temp = getNode(index);
return temp != null ? (E) temp.element : null;
}
private void checkRange(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException("索引数字不合法" + index);
}
}
private Node getNode(int index) {
checkRange(index);
Node temp = null;
if (index <= (size >> 1)) { //size>>1相当于除以2
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
} else {
temp = last;
for (int i = size - 1; i > index; i--) {
temp = temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(E element) {
Node node = new Node(element);
if (first == null) {
// node.previous =null;
// node.next = null;
first = node;
last = node;
} else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("[");
Node temp = first;
while (temp != null) {
stringBuilder.append(temp.element + ",");
temp = temp.next;
}
stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtLinkedList05<String> jtLinkedList05 = new JtLinkedList05<>();
jtLinkedList05.add("a");
jtLinkedList05.add("b");
jtLinkedList05.add("c");
jtLinkedList05.add("d");
jtLinkedList05.add("e");
jtLinkedList05.add("f");
System.out.println(jtLinkedList05);
jtLinkedList05.remove(3);
System.out.println(jtLinkedList05);
System.out.println(jtLinkedList05.get(1));
jtLinkedList05.remove(0);
System.out.println(jtLinkedList05);
jtLinkedList05.remove(3);
System.out.println(jtLinkedList05);
jtLinkedList05.add(0, "false");
System.out.println(jtLinkedList05);
jtLinkedList05.add(0, "true");
System.out.println(jtLinkedList05);
jtLinkedList05.add(4, "4");
System.out.println(jtLinkedList05);
jtLinkedList05.add(5, "5");
System.out.println(jtLinkedList05);
System.out.println(jtLinkedList05.get(1));
}
}