package com.test.utils;
/**
* 链表模拟类
*
* @author luozuyu
*
*/
public class LinkedList {
private Node head, tail; // 定义指向头和尾的指针
public void addFirst(Object el) {
head = new Node(el, head);
if (tail == null)
tail = head;
}
public void addLast(Object el) {
if (!isEmpty())
tail = tail.next = new Node(el);
else
head = tail = new Node(el);
}
public Object removeFirst() {
Object el = head.info;
if (head == tail)
head = tail = null;
else
head = head.next; // 否则就把头指针后移
return el;
}
public Object removeLast() {
Object el = tail.info;
if (head == tail)
head = tail = null;
else { // 如果不是上面那种情况就把tail设置到原来tail的上一个元素
Node temp; // 这个是临时的
for (temp = head; temp.next != tail; temp = temp.next)
tail = temp;
tail.next = null; // 把原来的尾设置为null
}
return el;
}
public boolean isContains(Object el) {
Node temp; // 有个缺陷!只能判断出离head近的那一个!有多个就不行
for (temp = head; temp != null && temp.info != el; temp = temp.next)
;
return temp != null;
}
public void delete(Object el) { // 通过el删除元素(有缺陷)
if (!isEmpty()) // 若非空并且只有一个元素且头元素的info和el等
if (head == tail && head.info == el) // 那么就删除头
head = tail = null;
else if (el == head.info) // 若非空并且el和头元素的info相等那么删除头
head = head.next;
else {
Node pred, temp;
for (pred = head, temp = head.next; temp != null && temp.info != el; pred = pred.next, temp = temp.next)
;// 判断其el是否在表内
if (temp != null) { // 若非空则删除元素
pred.next = temp.next;
if (temp == tail) // 若为尾则删除尾
tail = pred;
tail.next = null;
}
}
}
public boolean isEmpty() {
return null == head;
}
public void displayAll() {
for (Node temp = head; null != temp; temp = temp.next)
System.out.println(temp.info + " ");
}
// public void reverse() {
// if (head == null) return;
// Node node = head.next;
// head.next = null;
// while (node != null) {
// Node temp = node.next;
// node.next = head;
// head = node;
// node = temp;
// }
// }
/**
* 反转链表:遍历节点依次插入到新节点头部
*/
public void reverse() {
Node prev = null;
while (null != head) {
Node temp = head.next;
head.next = prev;
prev = head;
head = temp;
}
head = prev;
}
/**
* 递归实现反转链表
*/
public Node reverse(Node head) {
if (head == null || head.next == null)
return head;
Node prev = reverse(head.next);
head.next.next = head;
head.next = null;
return prev;
}
private static class Node {
private Object info; // 记录信息
private Node next;// 指向下一节点的指针
public Node(Object i) {
this(i, null);
}
public Node(Object i, Node n) {
info = i;
next = n;
}
}
}
链表简单模拟
最新推荐文章于 2025-03-10 20:42:41 发布