算法导论示例-LinkedList

原创 2006年06月06日 23:47:00

/**
 * Introduction to Algorithms, Second Edition 
 * 10.2 LinkedList
 * @author 土豆爸爸
 * 
 */
public class LinkedList {
    /**
     * 链表节点
     */
    public static class Node {
        int key;
        Node prev; //当前节点的前驱节点
        Node next; //当前节点的后继节点
        
        public Node(int key) {
            this.key = key;
        }
    }
    
    private Node head;
    
    /**
     * 查找键值为key的节点
     * @param key 待查找节点的键值
     * @return 键值为key的节点,如果没有找到返回null
     */
    public Node search(int key) {
        Node x = head;
        while(x != null && x.key != key) {
            x = x.next;
        }
        return x;
    }
    
    /**
     * 插入节点x。在链表的最前面插入。
     * @param x 待插入节点
     */
    public void insert(Node x) {
        x.next = head; //使x后继指向原来的head
        if(head != null) {
            head.prev = x; //使x成为原来的head的前驱
        }
        head = x; //使x成为新的head
    }
    
    /**
     * 删除节点x。
     * @param x 待删除节点
     */
    public void delete(Node x) {
        if(x.prev != null) { //如果x不是头节点
            x.prev.next = x.next; //使x的前驱的后继指向x的后继
        } else {
            head = x.next; //否则,使x的后继成为头节点
        }
        
        if(x.next != null) { //如果x不是尾节点
            x.next.prev = x.prev; //使x的后继的前驱指向x的前驱
        }
    }
}

import junit.framework.TestCase;

public class LinkedListTest extends TestCase{
    public void testLinkedList(){
        LinkedList list = new LinkedList();
        LinkedList.Node n1, n2, n3;
        list.insert(n1 = new LinkedList.Node(1));
        list.insert(n2 = new LinkedList.Node(2));
        list.insert(n3 = new LinkedList.Node(3));
        
        assertEquals(n3, list.search(3));
        assertEquals(n2, list.search(2));
        assertEquals(n1, list.search(1));
        assertEquals(n3, n2.prev);
        assertEquals(n1, n2.next);
        
        list.delete(n2);
        assertEquals(n3, n1.prev);
        assertEquals(n1, n3.next);
    }
}


相关文章推荐

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

【算法导论】最大子数组问题(递归+迭代)

最大子数组问题。首先考虑习题4-15,要求迭代实现,线性复杂度,首先直接上代码:import java.lang.reflect.Array; import java.util.Arrays;publ...

算法导论22.4拓扑排序 练习总结

22.4-1 给出算法 TOPOLOGICAL-SORT 运行于图 22-8 上时所生成的结点次序。这里的所有假设和练习 22.3-2 一样。 ANSWER: 22.4-2 请给出一个线性时间的算...
  • chan15
  • chan15
  • 2015年12月29日 12:57
  • 6879

看《算法导论》的一点感想

说实话,我没把那书看完,甚至没有看过1/10,至于做题就更没谱了,只要不是有人提起,我根本不知道哪个题居然在算导(下文简写成clrs)中出现过,但是我还要写一下我对这书的心得,看法和感受,尤其是和找工...
  • idwtwt
  • idwtwt
  • 2014年12月24日 00:44
  • 3553

算法导论习题解-第15章动态规划

#a is topological sorted, a[0] is s, a[-1] is t def longest(a): #d[i] is the longest distance fr...

一头扎进算法导论-堆排序

定义:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每...
  • hayre
  • hayre
  • 2016年10月23日 01:27
  • 211

【算法导论32-Java中如何覆写Hashcode()函数】

Hash函数今天看了网易公开课上《算法导论》关于Hash Tables的视频。 Hash函数最简单设计是通过对质数取余的方式进行,但是这涉及到取余运算,并不是一个高效算法。然后视频讲师又提供了另外一...

《算法导论》习题解答 Chapter 22.1-5(求平方图)

一、邻接矩阵实现 思路:如果是邻接矩阵存储,设邻接矩阵为A,则A*A即为平方图,只需要矩阵相乘即可; 伪代码: for i=1 to n for j=1 to n for k=1 ...
  • hcbbt
  • hcbbt
  • 2013年07月16日 01:19
  • 2506

算法导论学习笔记 第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法。虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlg...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-LinkedList
举报原因:
原因补充:

(最多只允许输入30个字)