天天看点

链表简单模拟

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;
  }
 }

}