节点(Node)
package Demo;
public class Node {
private Node next;
private Object value;
public Node() {
}
public Node(Object value,Node next) {
this.value = value;
this.next = next;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Object getValue() {
return value;
}
public void setValue(Object data) {
this.value = data;
}
}
链表(Mylink)
package Demo;
public class Mylink<T> {
private Node head;
private int size = 0;
public int getSize() {
return size;
}
public void add(T value) {
//如果头节点为null,直接添加到头节点中
if (head == null) {
head = new Node(value,null);
}else {
//当头节点不为null,通过头节点找到末尾节点
Node currentNode = findLastNode(head);
//将要添加的元素加入末尾节点
currentNode.setNext(new Node(value,null));
}
//更新size
size ++;
}
// 123 321 369
//找尾节点
private Node findLastNode(Node head) {
//如果头节点的下一个节点是null,那麽表示头节点就是末尾节点
//判断一个节点是否为末尾节点,就是看他的next是否为null,如果为null即为末尾节点
if(head.getNext() == null) {
return head;
}
//如果不是末尾节点,递归
return findLastNode(head.getNext());
}
//删除元素
public void remove(int index) {
//默认指向头节点
Node pointer = this.head;
//如果指定下标不小于size,或小于0,直接返回
if (judge(index)) {
return;
}
//删除第一个元素
if (index == 0) {
head = pointer.getNext();
return;
}
//在此循环中,需要将指针指向需要删除的元素的上一个元素
for (int i = 0; i < index-1; i++) {
pointer = pointer.getNext();
}
/*
* 将需要删除的元素的上一个元素的next指向下一个的下一个即可
*/
pointer.setNext(pointer.getNext().getNext());
//更新size
size --;
}
//获取元素
public Object get(int index) {
//如果指定下标不小于size,或小于0,直接返回
if(judge(index)) {
return null;
}
//默认指向头节点
Node pointer = this.head;
//如果index = 0 直接返回头节点的value值
if (index == 0) {
return pointer.getValue();
}
/*
* 此处进入这个循环后pointer指向的是第二个节点,因为默认指向头节点
* 在判断时,需要index - 1
*/
for (int i = 0; i < index; i++) {
pointer = pointer.getNext();
if (i == index-1) {
return pointer.getValue();
}
}
return null;
}
//修改元素
public void update(Object value,int index) {
//判断
if (judge(index)) {
return;
}
//默认指向头节点
Node headNode = this.head;
//如果index为0,直接修改头节点
if (index == 0) {
headNode.setValue(value);
}
/*
* 此处与获取元素相同,进入循环已经指向第二个节点所以index -1
*/
for (int i = 0; i < index; i++) {
headNode = headNode.getNext();
if (i == index -1) {
headNode.setValue(value);
}
}
}
//print
public void print() {
//头节点
Node head = this.head;
/*
* 如果当前节点不为null,打印value值,如果下一个节点不为null那麽指向下一个节点,否则退出循环
*/
while(head != null) {
System.out.println(head.getValue());
if (head.getNext() != null) {
head = head.getNext();
}else
break;
}
}
//判断下标是否在区间[0,size)中
private boolean judge(int index) {
return !(index < size) || index < 0 ;
}
}
测试
package Demo;
public class Test {
public static void main(String[] args) {
//创建链表
Mylink link = new Mylink();
link.add("123");
link.add("321");
link.add("369");
link.print();
System.out.println(link.getSize());
link.update("999", 0);
link.remove(-1);
link.print();
System.out.println(link.get(0));
}
}
评论
ee
ww2021-10-27 回复