链表简单模拟

来源:互联网 发布:简单软件开发工具 编辑:程序博客网 时间:2024/06/08 00:19

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

0 0