双向链表实现:

//1.3.31
package com.qiusongde.linkedlist; public class DoublyLinkedList<Item> { private DoublyNode<Item> first;
private DoublyNode<Item> last; //can be accessed outside this class
public static class DoublyNode<E> {
public E item;
public DoublyNode<E> next;
public DoublyNode<E> pre;
} public DoublyLinkedList() {
first = null;
last = null;
} /**
* insert item at the beginning of the list
*
* @param list the list to insert
* @param item the item to be inserted
*/
public static <T> void insertAtBeginning(DoublyLinkedList<T> list, T item) { DoublyNode<T> oldfirst = list.first;//save old first node list.first = new DoublyNode<T>();//new first node
list.first.item = item;//save item
list.first.next = oldfirst;//point to oldfirst
list.first.pre = null;//pre initialize to null if(oldfirst != null) {
oldfirst.pre = list.first;
} else {//oldfirst is null
list.last = list.first;
} } /**
* insert item at the end of the list
*
* @param list the list to insert
* @param item the item to be inserted
*/
public static <T> void insertAtTheEnd(DoublyLinkedList<T> list, T item) { DoublyNode<T> oldlast = list.last; list.last = new DoublyNode<T>();
list.last.item = item;
list.last.next = null;
list.last.pre = oldlast; if(oldlast == null) {
list.first = list.last;
} else {
oldlast.next = list.last;
} } /**
* remove the first node in the list. If the first node in the list is null, then do nothing.
*
* @param list the list whose first node will be removed
*/
public static <T> void removeFromBeginning(DoublyLinkedList<T> list) { if(list.first == null) {
return;//do nothing
} list.first = list.first.next;//new position for first
if(list.first == null) {//not more leave
list.last = null;
} else {
list.first.pre.next = null;
list.first.pre = null;
} } /**
* remove the last node in the list. If the last node in the list is null, then do nothing.
*
* @param list the list whose last node will be removed
*/
public static <T> void removeFromTheEnd(DoublyLinkedList<T> list) { if(list.last == null) {
return;//do nothing
} list.last = list.last.pre;
if(list.last == null) {
list.first = null;
} else {
list.last.next.pre = null;
list.last.next = null;
} } public static <T> DoublyNode<T> findDoublyNode(DoublyLinkedList<T> list, T item) {
DoublyNode<T> current = list.first; while(current != null) {
if(current.item.equals(item)) {
break;
}
current = current.next;
} return current;
} /**
* insert the item before the node in the list. if node is null or node isn't in the list, then do nothing.
*
* @param list the list in which the node is
*
* @param node the node before which the item will be inserted
*
* @param item the item to be inserted
*/
public static <T> void insertBeforeNode(DoublyLinkedList<T> list, DoublyNode<T> node, T item) { if(node == null) {//do nothing
return;
} if(isInList(list, node)) {//node is in list
DoublyNode<T> newnode = new DoublyNode<T>();
newnode.item = item; newnode.next = node;
if(node.pre != null) {//not first node in the list
node.pre.next = newnode;
} else {//first node in the list
list.first = newnode;//change first node
}
newnode.pre = node.pre;
node.pre = newnode;//should be last assign
} } /**
* insert the item after the node in the list. if node is null or node isn't in the list, then do nothing.
*
* @param list the list in which the node is
*
* @param node the node after which the item will be inserted
*
* @param item the item to be inserted
*/
public static <T> void insertAfterNode(DoublyLinkedList<T> list, DoublyNode<T> node, T item) { if(node == null) {//do nothing
return;
} if(isInList(list, node)) {
DoublyNode<T> newnode = new DoublyNode<T>();
newnode.item = item; newnode.pre = node;
if(node.next != null) {//not last node in the list
node.next.pre = newnode;
} else {//last node in the list
list.last = newnode;
}
newnode.next = node.next;
node.next = newnode;//should be last assign
} } /**
* remove the node in the list
*
* @param list the list in which the node is
* @param node the node to be removed
*/
public static <T> void removeNode(DoublyLinkedList<T> list, DoublyNode<T> node) { if(node == null) {
return;
} if(isInList(list, node)) {
if(list.first == node) {
removeFromBeginning(list);
}
else if(list.last == node) {
removeFromTheEnd(list);
}
else {
node.pre.next = node.next;
node.next.pre = node.pre;
}
} } /**
* see if the node is in the list
*
* @param list the list
* @param node the node
* @return {@code true} the node is in the list
* {@code false} the node isn't in the list
*/
public static <T> boolean isInList(DoublyLinkedList<T> list, DoublyNode<T> node) { DoublyNode<T> current = list.first; while(current != null) {
if(current == node) {
return true;
}
current = current.next;
} return false;
} @Override
public String toString() {
String s = ""; DoublyNode<Item> current = first;
while(current != null) {
s += current.item + " ";
current = current.next;
} s += first == null ? "first:null " : "first:" + first.item + " ";
s += last == null ? "last:null " : "last:" + last.item + " "; return s;
} }

测试用例:

package com.qiusongde.linkedlist;

import com.qiusongde.linkedlist.DoublyLinkedList.DoublyNode;

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom; public class Exercise1331 { public static void main(String[] args) { DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();
StdOut.println("Initial doublylist:");
StdOut.println(list);
StdOut.println(); //test insertAtBeginning function
StdOut.println("Test insertAtBeginning function");
for(int i = 1; i <= 10; i++) {
DoublyLinkedList.insertAtBeginning(list, i);
StdOut.println("insertAtBeginning success: " + i);
StdOut.println(list);
}
StdOut.println(); //test removeFromBeginning function
StdOut.println("Test removeFromBeginning function");
for(int i = 1; i <= 11; i++) {
DoublyLinkedList.removeFromBeginning(list);
StdOut.println("removeFromBeginning success: ");
StdOut.println(list);
}
StdOut.println(); //test insertAtTheEnd function
StdOut.println("Test insertAtTheEnd function");
for(int i = 1; i <= 10; i++) {
DoublyLinkedList.insertAtTheEnd(list, i);
StdOut.println("insertAtTheEnd success: " + i);
StdOut.println(list);
}
StdOut.println(); //test removeFromTheEnd function
StdOut.println("Test removeFromTheEnd function");
for(int i = 1; i <= 11; i++) {
DoublyLinkedList.removeFromTheEnd(list);
StdOut.println("removeFromTheEnd success: ");
StdOut.println(list);
}
StdOut.println(); //test insertBeforeNode function
StdOut.println("Test insertBeforeNode function");
for(int i = 1; i <= 10; i++) {
DoublyLinkedList.insertAtBeginning(list, i);
}
StdOut.println("Initial list:");
StdOut.println(list);
for(int i = 0; i < 10; i++) {
int number = StdRandom.uniform(10 + i) + 1;
DoublyNode<Integer> node = DoublyLinkedList.findDoublyNode(list, number);
DoublyLinkedList.insertBeforeNode(list, node, 11 + i);
StdOut.println("insert " + (11+i) + " BeforeNode " + node.item + " success");
StdOut.println(list);
}
StdOut.println(); //test remove
StdOut.println("Test removeNode function");
for(int i = 0; i < 20; i++) {
DoublyNode<Integer> node = DoublyLinkedList.findDoublyNode(list, i + 1);
DoublyLinkedList.removeNode(list, node);
StdOut.println("removeNode success:" + (i+1));
StdOut.println(list);
}
StdOut.println(); //test insertAfterNode function
StdOut.println("Test insertAfterNode function");
for(int i = 1; i <= 10; i++) {
DoublyLinkedList.insertAtBeginning(list, i);
}
StdOut.println("Initial list:");
StdOut.println(list);
for(int i = 0; i < 10; i++) {
int number = StdRandom.uniform(10 + i) + 1;
DoublyNode<Integer> node = DoublyLinkedList.findDoublyNode(list, number);
DoublyLinkedList.insertAfterNode(list, node, 11 + i);
StdOut.println("insert " + (11+i) + " AfterNode " + node.item + " success");
StdOut.println(list);
}
StdOut.println(); } }

结果输出:

Initial doublylist:
first:null last:null Test insertAtBeginning function
insertAtBeginning success: 1
1 first:1 last:1
insertAtBeginning success: 2
2 1 first:2 last:1
insertAtBeginning success: 3
3 2 1 first:3 last:1
insertAtBeginning success: 4
4 3 2 1 first:4 last:1
insertAtBeginning success: 5
5 4 3 2 1 first:5 last:1
insertAtBeginning success: 6
6 5 4 3 2 1 first:6 last:1
insertAtBeginning success: 7
7 6 5 4 3 2 1 first:7 last:1
insertAtBeginning success: 8
8 7 6 5 4 3 2 1 first:8 last:1
insertAtBeginning success: 9
9 8 7 6 5 4 3 2 1 first:9 last:1
insertAtBeginning success: 10
10 9 8 7 6 5 4 3 2 1 first:10 last:1 Test removeFromBeginning function
removeFromBeginning success:
9 8 7 6 5 4 3 2 1 first:9 last:1
removeFromBeginning success:
8 7 6 5 4 3 2 1 first:8 last:1
removeFromBeginning success:
7 6 5 4 3 2 1 first:7 last:1
removeFromBeginning success:
6 5 4 3 2 1 first:6 last:1
removeFromBeginning success:
5 4 3 2 1 first:5 last:1
removeFromBeginning success:
4 3 2 1 first:4 last:1
removeFromBeginning success:
3 2 1 first:3 last:1
removeFromBeginning success:
2 1 first:2 last:1
removeFromBeginning success:
1 first:1 last:1
removeFromBeginning success:
first:null last:null
removeFromBeginning success:
first:null last:null Test insertAtTheEnd function
insertAtTheEnd success: 1
1 first:1 last:1
insertAtTheEnd success: 2
1 2 first:1 last:2
insertAtTheEnd success: 3
1 2 3 first:1 last:3
insertAtTheEnd success: 4
1 2 3 4 first:1 last:4
insertAtTheEnd success: 5
1 2 3 4 5 first:1 last:5
insertAtTheEnd success: 6
1 2 3 4 5 6 first:1 last:6
insertAtTheEnd success: 7
1 2 3 4 5 6 7 first:1 last:7
insertAtTheEnd success: 8
1 2 3 4 5 6 7 8 first:1 last:8
insertAtTheEnd success: 9
1 2 3 4 5 6 7 8 9 first:1 last:9
insertAtTheEnd success: 10
1 2 3 4 5 6 7 8 9 10 first:1 last:10 Test removeFromTheEnd function
removeFromTheEnd success:
1 2 3 4 5 6 7 8 9 first:1 last:9
removeFromTheEnd success:
1 2 3 4 5 6 7 8 first:1 last:8
removeFromTheEnd success:
1 2 3 4 5 6 7 first:1 last:7
removeFromTheEnd success:
1 2 3 4 5 6 first:1 last:6
removeFromTheEnd success:
1 2 3 4 5 first:1 last:5
removeFromTheEnd success:
1 2 3 4 first:1 last:4
removeFromTheEnd success:
1 2 3 first:1 last:3
removeFromTheEnd success:
1 2 first:1 last:2
removeFromTheEnd success:
1 first:1 last:1
removeFromTheEnd success:
first:null last:null
removeFromTheEnd success:
first:null last:null Test insertBeforeNode function
Initial list:
10 9 8 7 6 5 4 3 2 1 first:10 last:1
insert 11 BeforeNode 7 success
10 9 8 11 7 6 5 4 3 2 1 first:10 last:1
insert 12 BeforeNode 8 success
10 9 12 8 11 7 6 5 4 3 2 1 first:10 last:1
insert 13 BeforeNode 10 success
13 10 9 12 8 11 7 6 5 4 3 2 1 first:13 last:1
insert 14 BeforeNode 10 success
13 14 10 9 12 8 11 7 6 5 4 3 2 1 first:13 last:1
insert 15 BeforeNode 2 success
13 14 10 9 12 8 11 7 6 5 4 3 15 2 1 first:13 last:1
insert 16 BeforeNode 4 success
13 14 10 9 12 8 11 7 6 5 16 4 3 15 2 1 first:13 last:1
insert 17 BeforeNode 12 success
13 14 10 9 17 12 8 11 7 6 5 16 4 3 15 2 1 first:13 last:1
insert 18 BeforeNode 7 success
13 14 10 9 17 12 8 11 18 7 6 5 16 4 3 15 2 1 first:13 last:1
insert 19 BeforeNode 15 success
13 14 10 9 17 12 8 11 18 7 6 5 16 4 3 19 15 2 1 first:13 last:1
insert 20 BeforeNode 9 success
13 14 10 20 9 17 12 8 11 18 7 6 5 16 4 3 19 15 2 1 first:13 last:1 Test removeNode function
removeNode success:1
13 14 10 20 9 17 12 8 11 18 7 6 5 16 4 3 19 15 2 first:13 last:2
removeNode success:2
13 14 10 20 9 17 12 8 11 18 7 6 5 16 4 3 19 15 first:13 last:15
removeNode success:3
13 14 10 20 9 17 12 8 11 18 7 6 5 16 4 19 15 first:13 last:15
removeNode success:4
13 14 10 20 9 17 12 8 11 18 7 6 5 16 19 15 first:13 last:15
removeNode success:5
13 14 10 20 9 17 12 8 11 18 7 6 16 19 15 first:13 last:15
removeNode success:6
13 14 10 20 9 17 12 8 11 18 7 16 19 15 first:13 last:15
removeNode success:7
13 14 10 20 9 17 12 8 11 18 16 19 15 first:13 last:15
removeNode success:8
13 14 10 20 9 17 12 11 18 16 19 15 first:13 last:15
removeNode success:9
13 14 10 20 17 12 11 18 16 19 15 first:13 last:15
removeNode success:10
13 14 20 17 12 11 18 16 19 15 first:13 last:15
removeNode success:11
13 14 20 17 12 18 16 19 15 first:13 last:15
removeNode success:12
13 14 20 17 18 16 19 15 first:13 last:15
removeNode success:13
14 20 17 18 16 19 15 first:14 last:15
removeNode success:14
20 17 18 16 19 15 first:20 last:15
removeNode success:15
20 17 18 16 19 first:20 last:19
removeNode success:16
20 17 18 19 first:20 last:19
removeNode success:17
20 18 19 first:20 last:19
removeNode success:18
20 19 first:20 last:19
removeNode success:19
20 first:20 last:20
removeNode success:20
first:null last:null Test insertAfterNode function
Initial list:
10 9 8 7 6 5 4 3 2 1 first:10 last:1
insert 11 AfterNode 10 success
10 11 9 8 7 6 5 4 3 2 1 first:10 last:1
insert 12 AfterNode 9 success
10 11 9 12 8 7 6 5 4 3 2 1 first:10 last:1
insert 13 AfterNode 8 success
10 11 9 12 8 13 7 6 5 4 3 2 1 first:10 last:1
insert 14 AfterNode 10 success
10 14 11 9 12 8 13 7 6 5 4 3 2 1 first:10 last:1
insert 15 AfterNode 10 success
10 15 14 11 9 12 8 13 7 6 5 4 3 2 1 first:10 last:1
insert 16 AfterNode 4 success
10 15 14 11 9 12 8 13 7 6 5 4 16 3 2 1 first:10 last:1
insert 17 AfterNode 8 success
10 15 14 11 9 12 8 17 13 7 6 5 4 16 3 2 1 first:10 last:1
insert 18 AfterNode 11 success
10 15 14 11 18 9 12 8 17 13 7 6 5 4 16 3 2 1 first:10 last:1
insert 19 AfterNode 14 success
10 15 14 19 11 18 9 12 8 17 13 7 6 5 4 16 3 2 1 first:10 last:1
insert 20 AfterNode 3 success
10 15 14 19 11 18 9 12 8 17 13 7 6 5 4 16 3 20 2 1 first:10 last:1

算法(Algorithms)第4版 练习 1.3.31的更多相关文章

  1. 1.2 Data Abstraction(算法 Algorithms 第4版)

    1.2.1 package com.qiusongde; import edu.princeton.cs.algs4.Point2D; import edu.princeton.cs.algs4.St ...

  2. 1.1 BASIC PROGRAMMING MODEL(算法 Algorithms 第4版)

    1.1.1 private static void exercise111() { StdOut.println("1.1.1:"); StdOut.println((0+15)/ ...

  3. ubuntu命令行下java工程编辑与算法(第四版)环境配置

    ubuntu命令行下java工程编辑与算法(第四版)环境配置 java 命令行 javac java 在学习算法(第四版)中的实例时,因需要安装配套的java编译环境,可是在编译java文件的时候总是 ...

  4. 配置算法(第4版)的Java编译环境

    1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...

  5. 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列

    因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...

  6. 在Eclipse下配置算法(第四版)运行环境

    第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...

  7. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  8. 算法(第四版)C#题解——2.1

    算法(第四版)C#题解——2.1   写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...

  9. 《算法》第四版 IDEA 运行环境的搭建

    <算法>第四版 IDEA 运行环境的搭建 新建 模板 小书匠 在搭建之初,我是想不到会出现如此之多的问题.我看了网上的大部分教程,都是基于Eclipse搭建的,还没有使用IDEA搭建的教程 ...

  10. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

随机推荐

  1. 我最喜欢的模板jade(pug)学习和使用

    由于版权问题,现已改名pug.但无须担心,几乎没什么区别.就算依然使用jade也不会有太大影响. 慢慢迁移过渡即可 # 官网 https://pugjs.org # github https://gi ...

  2. 【Linux 驱动】设备驱动程序再理解

    学习设备驱动编程也有一段时间了,也写过了几个驱动程序,因此有对设备驱动程序有了一些新的理解和认识,总结一下.学习设备驱动编程也有一段时间了,也写过了几个驱动程序.因此有对设备驱动程序有了一些新的理解和 ...

  3. Java银行调度系统

    具体需求如下: 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费.电话费之类业务的客户). 异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户:普通客户:快速客户 ...

  4. CAP原则 和BASE

    CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼 [1]  ...

  5. applicationContext-XXX.xml和XXX-servlet.xml的区别

    1.ApplicationContext.xml  是spring 全局配置文件,用来控制spring 特性的 2.dispatcher-servlet.xml 是spring mvc里面的,控制器. ...

  6. JLink defective

    下载了最新的JLink V622g,打开JLink命令行后,提示以下信息 The connected J-Link is defective,Proper operation cannot be gu ...

  7. (C#)为应用程式设定运行权限(System.Security类下的GenericIdentity,GenericPrincipal,PrincipalPermission)

    最近看书<编写高质量代码改善C#程序的157个建议>,知识点备忘: System.Security.Principal.GenericIdentity==>表示一般用户 System ...

  8. (转) 对svn分支合并类型和深度的理解

    合并的工作是把主干或者分支上合并范围内的所有改动列出,并对比当前工作副本的内容,由合并者手工修改冲突,然后提交到服务器的相应目录里.如果当前工作副本是主干,则合并的范围是分支上的改动,如果工作副本是分 ...

  9. Python3 多线程 学习 threading

    #-*- coding:utf-8 --*- #多线程测试 import time import datetime import threading def worker(): print(" ...

  10. Coursera machine learning 第二周 quiz 答案 Octave/Matlab Tutorial

    https://www.coursera.org/learn/machine-learning/exam/dbM1J/octave-matlab-tutorial Octave Tutorial 5  ...