1. 数组
1.1 稀疏数组
public class GcdTest {
public static void main ( String[ ] args) {
System. out. println ( "请输入两个数: " ) ;
Scanner scanner = new Scanner ( System. in) ;
int p = scanner. nextInt ( ) ;
int q = scanner. nextInt ( ) ;
int result = gcd ( p, q) ;
System. out. println ( "最大公约数为: " + result) ;
scanner. close ( ) ;
}
public static int gcd ( int p, int q) {
if ( q == 0 ) {
return p;
} else {
int r = p % q;
return gcd ( q, r) ;
}
}
}
public class SparseArray {
public static void main ( String[ ] args) {
int chessArr[ ] [ ] = new int [ 11 ] [ 11 ] ;
chessArr[ 1 ] [ 2 ] = 1 ;
chessArr[ 2 ] [ 3 ] = 2 ;
chessArr[ 5 ] [ 7 ] = 4 ;
System. out. println ( "原始的二维数组: " ) ;
for ( int [ ] row : chessArr) {
for ( int data : row) {
System. out. printf ( "%d\t" , data) ;
}
System. out. println ( ) ;
}
int sum = 0 ;
for ( int i = 0 ; i < 11 ; i++ ) {
for ( int j = 0 ; j < 11 ; j++ ) {
if ( chessArr[ i] [ j] != 0 ) {
sum++ ;
}
}
}
int sparseArray[ ] [ ] = new int [ sum + 1 ] [ 3 ] ;
sparseArray[ 0 ] [ 0 ] = 11 ;
sparseArray[ 0 ] [ 1 ] = 11 ;
sparseArray[ 0 ] [ 2 ] = sum;
int count = 0 ;
for ( int i = 0 ; i < 11 ; i++ ) {
for ( int j = 0 ; j < 11 ; j++ ) {
if ( chessArr[ i] [ j] != 0 ) {
count++ ;
sparseArray[ count] [ 0 ] = i;
sparseArray[ count] [ 1 ] = j;
sparseArray[ count] [ 2 ] = chessArr[ i] [ j] ;
}
}
}
System. out. println ( ) ;
System. out. println ( "得到的稀疏数组: " ) ;
for ( int i = 0 ; i < sparseArray. length; i++ ) {
System. out. printf ( "%d\t%d\t%d\t\n" , sparseArray[ i] [ 0 ] , sparseArray[ i] [ 1 ] , sparseArray[ i] [ 2 ] ) ;
}
System. out. println ( ) ;
int newChessArray[ ] [ ] = new int [ sparseArray[ 0 ] [ 0 ] ] [ sparseArray[ 0 ] [ 1 ] ] ;
for ( int i = 1 ; i < sparseArray. length; i++ ) {
newChessArray[ sparseArray[ i] [ 0 ] ] [ sparseArray[ i] [ 1 ] ] = sparseArray[ i] [ 2 ] ;
}
for ( int i = 0 ; i < 11 ; i++ ) {
for ( int j = 0 ; j < 11 ; j++ ) {
System. out. printf ( "%d\t" , newChessArray[ i] [ j] ) ;
}
System. out. println ( ) ;
}
}
}
斐波那契数列
public class Fib {
public static void main ( String[ ] args) {
System. out. println ( fib2 ( 0 ) ) ;
System. out. println ( fib2 ( 1 ) ) ;
System. out. println ( fib2 ( 2 ) ) ;
System. out. println ( fib2 ( 3 ) ) ;
System. out. println ( fib2 ( 4 ) ) ;
System. out. println ( fib2 ( 5 ) ) ;
System. out. println ( fib2 ( 6 ) ) ;
}
public static int fib1 ( int n) {
if ( n <= 1 ) {
return n;
}
return fib1 ( n - 1 ) + fib1 ( n - 2 ) ;
}
public static int fib2 ( int n) {
if ( n <= 1 ) {
return n;
}
int first = 0 ;
int second = 1 ;
int sum = 0 ;
for ( int i = 0 ; i < n - 1 ; i++ ) {
sum = first + second;
first = second;
second = sum;
}
return second;
}
public static int fib3 ( int n) {
if ( n <= 1 ) {
return n;
}
int first = 0 ;
int second = 1 ;
while ( n-- > 1 ) {
second = first + second;
first = second - first;
}
return second;
}
}
2. 线性表
2.1 顺序表
public class DynamicArrayTest {
public static void main ( String[ ] args) {
DynamicArray< Integer> array = new DynamicArray ( ) ;
array. add ( 10 ) ;
array. add ( 20 ) ;
array. add ( 30 ) ;
array. add ( 1 , 40 ) ;
array. remove ( 1 ) ;
array. set ( 1 , 2 ) ;
System. out. println ( array) ;
}
}
public interface List < E> {
int size ( ) ;
boolean isEmpty ( ) ;
void clear ( ) ;
boolean contains ( E data) ;
void add ( E data) ;
void add ( int index, E data) ;
void remove ( E data) ;
E remove ( int index) ;
E get ( int index) ;
E set ( int index, E data) ;
int indexOf ( E data) ;
}
class DynamicArray < E> implements List {
private int size;
private E[ ] array;
private static final int DEFAULT_CAPATICY = 10 ;
private static final int ELEMENT_NOT_FOUND = - 1 ;
public DynamicArray ( ) {
array = ( E[ ] ) new Object [ DEFAULT_CAPATICY] ;
}
public DynamicArray ( int capaticy) {
if ( capaticy <= 0 ) {
throw new RuntimeException ( "数组容量应该大于0" ) ;
}
capaticy = ( capaticy < DEFAULT_CAPATICY) ? DEFAULT_CAPATICY : capaticy;
array = ( E[ ] ) new Object [ capaticy] ;
}
public int size ( ) {
return size;
}
public boolean isEmpty ( ) {
return size == 0 ;
}
public void add ( E data) {
array[ size++ ] = data;
}
public void add ( int index, E data) {
if ( index < 0 || index > size) {
throw new IndexOutOfBoundsException ( "你输入的下标不合法" ) ;
}
ensureCapacity ( size + 1 ) ;
for ( int i = size; i > index; i-- ) {
array[ i + 1 ] = array[ i] ;
}
array[ index] = data;
size++ ;
}
private void ensureCapacity ( int capacity) {
int oldCapacity = array. length;
if ( oldCapacity > capacity) {
return ;
}
int newCapacity = oldCapacity + ( oldCapacity >> 1 ) ;
E[ ] newArray = ( E[ ] ) new Object [ newCapacity] ;
for ( int i = 0 ; i < size; i++ ) {
newArray[ i] = array[ i] ;
}
array = newArray;
}
public E remove ( int index) {
if ( index < 0 || index >= size) {
throw new IndexOutOfBoundsException ( "你输入的下标不合法" ) ;
}
E res = array[ index] ;
for ( int i = index + 1 ; i < size; i++ ) {
array[ i - 1 ] = array[ i] ;
}
size-- ;
array[ size] = null;
trim ( ) ;
return res;
}
private void trim ( ) {
int capacity = array. length;
int newCapacity = capacity >> 1 ;
if ( size >= newCapacity || newCapacity <= DEFAULT_CAPATICY) {
return ;
}
E[ ] newArray = ( E[ ] ) new Object [ newCapacity] ;
for ( int i = 0 ; i < size; i++ ) {
newArray[ i] = array[ i] ;
}
array = newArray;
}
public void remove ( E data) {
remove ( indexOf ( data) ) ;
}
public E get ( int index) {
if ( index < 0 || index >= size) {
throw new IndexOutOfBoundsException ( "你输入的下标不合法" ) ;
}
return array[ index] ;
}
public E set ( int index, E data) {
if ( index < 0 || index >= size) {
throw new IndexOutOfBoundsException ( "你输入的下标不合法" ) ;
}
E res = array[ index] ;
array[ index] = data;
return res;
}
public int indexOf ( E data) {
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( array[ i] ) ) {
return i;
}
}
return ELEMENT_NOT_FOUND;
}
public boolean contains ( E data) {
return indexOf ( data) != ELEMENT_NOT_FOUND;
}
public void clear ( ) {
for ( int i = 0 ; i < size; i++ ) {
array[ i] = null;
}
size = 0 ;
if ( array != null && array. length > DEFAULT_CAPATICY) {
array = ( E[ ] ) new Object [ DEFAULT_CAPATICY] ;
}
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( array[ i] ) ;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
2.2 单链表
public class SingleLinkedList {
public static void main ( String[ ] args) {
PersonNode personNode1 = new PersonNode ( 1 , "汤昕" , "昕昕" ) ;
PersonNode personNode2 = new PersonNode ( 2 , "李一桐" , "一桐" ) ;
PersonNode personNode3 = new PersonNode ( 3 , "袁冰妍" , "冰淇淋" ) ;
PersonNode personNode4 = new PersonNode ( 4 , "林允儿" , "允儿" ) ;
SingleList singleList = new SingleList ( ) ;
singleList. addByOrder ( personNode1) ;
singleList. addByOrder ( personNode3) ;
singleList. addByOrder ( personNode4) ;
singleList. addByOrder ( personNode2) ;
System. out. println ( "修改之前的链表: " ) ;
singleList. list ( ) ;
PersonNode newPersonNode = new PersonNode ( 4 , "赵丽颖" , "萤火虫" ) ;
singleList. update ( newPersonNode) ;
System. out. println ( "修改之后的链表: " ) ;
singleList. list ( ) ;
singleList. delete ( 4 ) ;
System. out. println ( "删除后的链表: " ) ;
singleList. list ( ) ;
System. out. println ( "单链表有效节点的个数为: " + getLength ( singleList. getHead ( ) ) ) ;
PersonNode resultNode = findLastIndexNode ( singleList. getHead ( ) , 1 ) ;
System. out. println ( "resultNode = " + resultNode) ;
System. out. println ( "反转之前的链表: " ) ;
singleList. list ( ) ;
System. out. println ( "反转之后的链表: " ) ;
reverseList ( singleList. getHead ( ) ) ;
singleList. list ( ) ;
System. out. println ( "逆序打印的单链表(链表本身的结构并没有改变): " ) ;
reversePrintList ( singleList. getHead ( ) ) ;
}
public static int getLength ( PersonNode head) {
if ( head. next == null) {
return 0 ;
} else {
int length = 0 ;
PersonNode temp = head. next;
while ( temp != null) {
length++ ;
temp = temp. next;
}
return length;
}
}
public static PersonNode findLastIndexNode ( PersonNode head, int index) {
if ( head. next == null) {
return null;
} else {
int length = getLength ( head) ;
if ( index <= 0 || index > length) {
return null;
} else {
PersonNode temp = head. next;
for ( int i = 0 ; i < ( length - index) ; i++ ) {
temp = temp. next;
}
return temp;
}
}
}
public static void reverseList ( PersonNode head) {
if ( head. next == null || head. next. next == null) {
return ;
}
PersonNode temp = head. next;
PersonNode reverseHead = new PersonNode ( ) ;
PersonNode nextNode = null;
while ( temp != null) {
nextNode = temp. next;
temp. next = reverseHead. next;
reverseHead. next = temp;
temp = nextNode;
}
head. next = reverseHead. next;
}
public static void reversePrintList ( PersonNode head) {
if ( head. next == null) {
return ;
}
Stack< PersonNode> stack = new Stack < > ( ) ;
PersonNode temp = head. next;
while ( temp != null) {
stack. push ( temp) ;
temp = temp. next;
}
while ( stack. size ( ) > 0 ) {
System. out. println ( stack. pop ( ) ) ;
}
}
}
class SingleList {
private PersonNode head = new PersonNode ( ) ;
public PersonNode getHead ( ) {
return head;
}
public void add ( PersonNode node) {
PersonNode temp = head;
while ( true ) {
if ( temp. next == null) {
break ;
}
temp = temp. next;
}
temp. next = node;
}
public void addByOrder ( PersonNode node) {
PersonNode temp = head;
boolean flag = false ;
while ( true ) {
if ( temp. next == null) {
break ;
} else if ( temp. next. getNo ( ) > node. getNo ( ) ) {
break ;
} else if ( temp. getNo ( ) == node. getNo ( ) ) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
System. out. println ( "准备插入的编号" + node. getNo ( ) + "已经存在,不能加入" ) ;
} else {
node. next = temp. next;
temp. next = node;
}
}
public void update ( PersonNode node) {
if ( head. next == null) {
System. out. println ( "链表为空..." ) ;
return ;
} else {
PersonNode temp = head. next;
boolean flag = false ;
while ( true ) {
if ( temp == null) {
break ;
} else if ( temp. getNo ( ) == node. getNo ( ) ) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
temp. setName ( node. getName ( ) ) ;
temp. setNickName ( node. getNickName ( ) ) ;
} else {
System. out. println ( "没有找到编号为" + node. getNo ( ) + "的节点,无法修改..." ) ;
}
}
}
public void delete ( int no) {
PersonNode temp = head;
boolean flag = false ;
while ( true ) {
if ( temp. next == null) {
break ;
} else if ( temp. next. getNo ( ) == no) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
temp. next = temp. next. next;
} else {
System. out. println ( "要删除的" + no + "结点不存在,无法删除..." ) ;
}
}
public void list ( ) {
if ( head. next == null) {
System. out. println ( "链表为空..." ) ;
return ;
} else {
PersonNode temp = head. next;
while ( true ) {
if ( temp == null) {
break ;
}
System. out. println ( temp) ;
temp = temp. next;
}
}
}
}
class PersonNode {
private int no;
private String name;
private String nickName;
public PersonNode next;
public PersonNode ( ) {
}
public PersonNode ( int no, String name, String nickName) {
this . no = no;
this . name = name;
this . nickName = nickName;
}
public int getNo ( ) {
return no;
}
public void setNo ( int no) {
this . no = no;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public String getNickName ( ) {
return nickName;
}
public void setNickName ( String nickName) {
this . nickName = nickName;
}
@Override
public String toString ( ) {
return "PersonNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}' ;
}
}
public abstract class AbstractList < E> implements List < E> {
protected int size;
public void outOfBounds ( int index) {
throw new IndexOutOfBoundsException ( "Index" + index + ", Size: " + size) ;
}
public void rangeCheck ( int index) {
if ( index < 0 || index >= size) {
outOfBounds ( index) ;
}
}
public void rangeCheckForAdd ( int index) {
if ( index < 0 || index > size) {
outOfBounds ( index) ;
}
}
public boolean contains ( E data) {
return indexOf ( data) != ELEMENT_NOT_FOUND;
}
public void remove ( E data) {
}
public int size ( ) {
return size;
}
public boolean isEmpty ( ) {
return size == 0 ;
}
public int indexOf ( E data) {
return 0 ;
}
}
public class LinkedList < E> extends AbstractList < E> {
private Node< E> first;
private static class Node < E> {
E element;
Node< E> next;
public Node ( E element, Node< E> next) {
this . element = element;
this . next = next;
}
}
public void clear ( ) {
size = 0 ;
first = null;
}
public Node< E> node ( int index) {
rangeCheck ( index) ;
Node< E> node = first;
for ( int i = 0 ; i < index; i++ ) {
node = node. next;
}
return node;
}
public void add ( E data) {
add ( size, data) ;
}
public void add ( int index, E data) {
if ( index == 0 ) {
Node< E> node = new Node < > ( data, first) ;
first = node;
} else {
Node< E> preNode = node ( index - 1 ) ;
Node< E> newNode = new Node < > ( data, preNode. next) ;
preNode. next = newNode;
}
size++ ;
}
public E remove ( int index) {
Node< E> resNode = first;
if ( index == 0 ) {
first = first. next;
} else {
Node< E> preNode = node ( index - 1 ) ;
resNode = preNode. next;
if ( index == size) {
preNode. next = null;
} else {
preNode. next = resNode. next;
}
}
size-- ;
return resNode. element;
}
public E get ( int index) {
return node ( index) . element;
}
public E set ( int index, E data) {
Node< E> node = node ( index) ;
E res = node. element;
node. element = data;
return res;
}
public int indexOf ( E data) {
Node< E> node = first;
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( node. element) ) {
return i;
}
node = node. next;
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
Node< E> node = first;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( node. element) ;
node = node. next;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
public class LinkedListTest {
public static void main ( String[ ] args) {
List< Integer> list = new LinkedList < > ( ) ;
list. add ( 10 ) ;
list. add ( 0 , 20 ) ;
list. add ( 30 ) ;
list. add ( list. size ( ) , 40 ) ;
list. remove ( 1 ) ;
System. out. println ( list) ;
}
}
public class LinkedList2 < E> extends AbstractList < E> {
private Node< E> first;
public LinkedList2 ( ) {
first = new Node ( null, null) ;
}
private static class Node < E> {
E element;
Node< E> next;
public Node ( E element, Node< E> next) {
this . element = element;
this . next = next;
}
}
public void clear ( ) {
size = 0 ;
first. next = null;
}
public Node< E> node ( int index) {
rangeCheck ( index) ;
Node< E> node = first. next;
for ( int i = 0 ; i < index; i++ ) {
node = node. next;
}
return node;
}
public void add ( E data) {
add ( size, data) ;
}
public void add ( int index, E data) {
rangeCheckForAdd ( index) ;
Node< E> preNode = ( index == 0 ? first : node ( index - 1 ) ) ;
Node< E> newNode = new Node < > ( data, preNode. next) ;
preNode. next = newNode;
size++ ;
}
public E remove ( int index) {
rangeCheck ( index) ;
Node< E> preNode = ( index == 0 ? first : node ( index - 1 ) ) ;
Node< E> resNode = preNode. next;
if ( index == size) {
preNode. next = null;
} else {
preNode. next = resNode. next;
}
size-- ;
return resNode. element;
}
public E get ( int index) {
return node ( index) . element;
}
public E set ( int index, E data) {
Node< E> node = node ( index) ;
E res = node. element;
node. element = data;
return res;
}
public int indexOf ( E data) {
Node< E> node = first. next;
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( node. element) ) {
return i;
}
node = node. next;
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
Node< E> node = first. next;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( node. element) ;
node = node. next;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
2.3 双链表
public class DoubleLinkedList {
public static void main ( String[ ] args) {
PersonDoubleNode personNode1 = new PersonDoubleNode ( 1 , "王晨" , "晨晨" ) ;
PersonDoubleNode personNode2 = new PersonDoubleNode ( 2 , "李一桐" , "一桐" ) ;
PersonDoubleNode personNode3 = new PersonDoubleNode ( 3 , "袁冰妍" , "冰淇淋" ) ;
PersonDoubleNode personNode4 = new PersonDoubleNode ( 4 , "林允儿" , "允儿" ) ;
DoubleList doubleList = new DoubleList ( ) ;
doubleList. addByOrder ( personNode1) ;
doubleList. addByOrder ( personNode4) ;
doubleList. addByOrder ( personNode3) ;
doubleList. addByOrder ( personNode2) ;
doubleList. list ( ) ;
PersonDoubleNode newNode = new PersonDoubleNode ( 4 , "赵丽颖" , "萤火虫" ) ;
doubleList. update ( newNode) ;
System. out. println ( "修改后的链表: " ) ;
doubleList. list ( ) ;
doubleList. delete ( 4 ) ;
System. out. println ( "删除后的链表: " ) ;
doubleList. list ( ) ;
}
}
class DoubleList {
private PersonDoubleNode head = new PersonDoubleNode ( ) ;
public PersonDoubleNode getHead ( ) {
return head;
}
public void add ( PersonDoubleNode node) {
PersonDoubleNode temp = head;
while ( true ) {
if ( temp. next == null) {
break ;
}
temp = temp. next;
}
temp. next = node;
node. pre = temp;
}
public void addByOrder ( PersonDoubleNode node) {
if ( head. next == null) {
head. next = node;
node. pre = head;
return ;
}
PersonDoubleNode temp = head;
boolean flag = false ;
boolean flag1 = false ;
while ( true ) {
if ( temp. next == null) {
flag1 = true ;
break ;
} else if ( temp. next. getNo ( ) > node. getNo ( ) ) {
break ;
} else if ( temp. next. getNo ( ) == node. getNo ( ) ) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
System. out. println ( "准备插入的编号" + node. getNo ( ) + "已经存在,不能加入" ) ;
} else if ( flag1) {
add ( node) ;
} else {
node. next = temp. next;
node. pre = temp;
temp. next. pre = node;
temp. next = node;
}
}
public void update ( PersonDoubleNode node) {
if ( head. next == null) {
System. out. println ( "链表为空..." ) ;
return ;
} else {
PersonDoubleNode temp = head. next;
boolean flag = false ;
while ( true ) {
if ( temp == null) {
break ;
} else if ( temp. getNo ( ) == node. getNo ( ) ) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
temp. setName ( node. getName ( ) ) ;
temp. setNickName ( node. getNickName ( ) ) ;
} else {
System. out. println ( "没有找到编号为" + node. getNo ( ) + "的节点,无法修改..." ) ;
}
}
}
public void delete ( int no) {
if ( head. next == null) {
System. out. println ( "当前链表为空,无法删除..." ) ;
return ;
}
PersonDoubleNode temp = head. next;
boolean flag = false ;
while ( true ) {
if ( temp == null) {
break ;
} else if ( temp. getNo ( ) == no) {
flag = true ;
break ;
}
temp = temp. next;
}
if ( flag) {
temp. pre. next = temp. next;
if ( temp. next != null) {
temp. next. pre = temp. pre;
}
} else {
System. out. println ( "要删除的" + no + "结点不存在,无法删除..." ) ;
}
}
public void list ( ) {
if ( head. next == null) {
System. out. println ( "链表为空..." ) ;
return ;
} else {
PersonDoubleNode temp = head. next;
while ( true ) {
if ( temp == null) {
break ;
}
System. out. println ( temp) ;
temp = temp. next;
}
}
}
}
class PersonDoubleNode {
private int no;
private String name;
private String nickName;
public PersonDoubleNode next;
public PersonDoubleNode pre;
public PersonDoubleNode ( ) {
}
public PersonDoubleNode ( int no, String name, String nickName) {
this . no = no;
this . name = name;
this . nickName = nickName;
}
public int getNo ( ) {
return no;
}
public void setNo ( int no) {
this . no = no;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public String getNickName ( ) {
return nickName;
}
public void setNickName ( String nickName) {
this . nickName = nickName;
}
@Override
public String toString ( ) {
return "PersonDoubleNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}' ;
}
}
public class DoubleList < E> extends AbstractList < E> {
public static void main ( String[ ] args) {
List< Integer> list = new DoubleList < > ( ) ;
list. add ( 11 ) ;
list. add ( 22 ) ;
list. add ( 33 ) ;
list. add ( 44 ) ;
list. add ( 0 , 55 ) ;
list. add ( 2 , 66 ) ;
list. add ( list. size ( ) , 77 ) ;
System. out. println ( list) ;
list. remove ( 0 ) ;
list. remove ( 2 ) ;
list. remove ( list. size ( ) - 1 ) ;
System. out. println ( list) ;
}
private Node< E> first;
private Node< E> last;
private static class Node < E> {
E element;
Node< E> next;
Node< E> pre;
public Node ( Node< E> pre, E element, Node< E> next) {
this . element = element;
this . next = next;
this . pre = pre;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
if ( pre != null) {
s. append ( pre. element) ;
} else {
s. append ( "null" ) ;
}
s. append ( "->" ) . append ( element) . append ( "->" ) ;
if ( next != null) {
s. append ( next. element) ;
} else {
s. append ( "null" ) ;
}
return s. toString ( ) ;
}
}
public void clear ( ) {
size = 0 ;
first = null;
last = null;
}
public Node< E> node ( int index) {
rangeCheck ( index) ;
Node< E> node = null;
if ( index < ( size >> 1 ) ) {
node = first;
for ( int i = 0 ; i < index; i++ ) {
node = node. next;
}
} else {
node = last;
for ( int i = size - 1 ; i > index; i-- ) {
node = node. pre;
}
}
return node;
}
public void add ( E data) {
add ( size, data) ;
}
public void add ( int index, E data) {
rangeCheckForAdd ( index) ;
if ( index == size) {
Node< E> oldLast = last;
last = new Node < E> ( oldLast, data, null) ;
if ( oldLast == null) {
first = last;
} else {
oldLast. next = last;
}
} else {
Node< E> node = node ( index) ;
Node< E> preNode = node. pre;
Node< E> newNode = new Node ( preNode, data, node) ;
node. pre = newNode;
if ( preNode == null) {
first = newNode;
} else {
preNode. next = newNode;
}
}
size++ ;
}
public E remove ( int index) {
rangeCheck ( index) ;
Node< E> node = node ( index) ;
Node< E> preNode = node. pre;
Node< E> nextNode = node. next;
if ( preNode == null) {
first = nextNode;
} else {
preNode. next = nextNode;
}
if ( nextNode == null) {
last = preNode;
} else {
nextNode. pre = preNode;
}
size-- ;
return node. element;
}
public E get ( int index) {
return node ( index) . element;
}
public E set ( int index, E data) {
Node< E> node = node ( index) ;
E res = node. element;
node. element = data;
return res;
}
public int indexOf ( E data) {
Node< E> node = first;
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( node. element) ) {
return i;
}
node = node. next;
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
Node< E> node = first;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( node) ;
node = node. next;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
2.4 单向循环链表
public class Josepfu {
public static void main ( String[ ] args) {
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList ( ) ;
circleSingleLinkedList. add ( 10 ) ;
circleSingleLinkedList. show ( ) ;
circleSingleLinkedList. countNode ( 4 , 2 , 5 ) ;
}
}
class CircleSingleLinkedList {
private Node first = null;
public void add ( int data) {
if ( data < 1 ) {
System. out. println ( "data的值不正确..." ) ;
return ;
} else {
Node temp = null;
for ( int i = 1 ; i <= data; i++ ) {
Node node = new Node ( i) ;
if ( i == 1 ) {
first = node;
first. setNext ( first) ;
temp = first;
} else {
temp. setNext ( node) ;
node. setNext ( first) ;
temp = node;
}
}
}
}
public void show ( ) {
if ( first == null) {
System. out. println ( "当前链表没有任何结点..." ) ;
return ;
}
Node temp = first;
while ( true ) {
System. out. println ( "当前结点的编号为: " + temp. getNo ( ) ) ;
if ( temp. getNext ( ) == first) {
break ;
}
temp = temp. getNext ( ) ;
}
}
public void countNode ( int startNo, int countNum, int nums) {
if ( first == null || startNo < 1 || startNo > nums) {
System. out. println ( "你的输入有误,请重新输入..." ) ;
return ;
}
Node helper = first;
while ( true ) {
if ( helper. getNext ( ) == first) {
break ;
}
helper = helper. getNext ( ) ;
}
for ( int i = 0 ; i < startNo - 1 ; i++ ) {
first = first. getNext ( ) ;
helper = helper. getNext ( ) ;
}
while ( true ) {
if ( first == helper) {
break ;
}
for ( int i = 0 ; i < countNum - 1 ; i++ ) {
first = first. getNext ( ) ;
helper = helper. getNext ( ) ;
}
System. out. println ( "结点" + first. getNo ( ) + "出圈" ) ;
first = first. getNext ( ) ;
helper. setNext ( first) ;
}
System. out. println ( "最后留在圈中的结点是: " + first. getNo ( ) ) ;
}
}
class Node {
private int no;
private Node next;
public Node ( int no) {
this . no = no;
}
public int getNo ( ) {
return no;
}
public void setNo ( int no) {
this . no = no;
}
public Node getNext ( ) {
return next;
}
public void setNext ( Node next) {
this . next = next;
}
}
public class SingleCircleLinkedList < E> extends AbstractList < E> {
public static void main ( String[ ] args) {
List< Integer> list = new SingleCircleLinkedList < > ( ) ;
list. add ( 1 ) ;
list. add ( 2 ) ;
list. add ( 3 ) ;
list. add ( 0 , 5 ) ;
list. add ( list. size ( ) , 6 ) ;
list. remove ( 0 ) ;
System. out. println ( list) ;
}
private Node< E> first;
private static class Node < E> {
E element;
Node< E> next;
public Node ( E element, Node< E> next) {
this . element = element;
this . next = next;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
s. append ( element) . append ( "->" ) . append ( next. element) ;
return s. toString ( ) ;
}
}
public void clear ( ) {
size = 0 ;
first = null;
}
public Node< E> node ( int index) {
rangeCheck ( index) ;
Node< E> node = first;
for ( int i = 0 ; i < index; i++ ) {
node = node. next;
}
return node;
}
public void add ( E data) {
add ( size, data) ;
}
public void add ( int index, E data) {
rangeCheckForAdd ( index) ;
if ( index == 0 ) {
Node< E> newFirst = new Node < > ( data, first) ;
Node< E> lastNode = ( size == 0 ) ? newFirst : node ( size - 1 ) ;
lastNode. next = newFirst;
first = newFirst;
} else {
Node< E> preNode = node ( index - 1 ) ;
Node< E> newNode = new Node < > ( data, preNode. next) ;
preNode. next = newNode;
}
size++ ;
}
public E remove ( int index) {
rangeCheck ( index) ;
Node< E> resNode = first;
if ( index == 0 ) {
if ( size == 1 ) {
first = null;
} else {
Node< E> lastNode = node ( size - 1 ) ;
first = first. next;
lastNode. next = first;
}
} else {
Node< E> preNode = node ( index - 1 ) ;
resNode = preNode. next;
if ( index == size) {
preNode. next = null;
} else {
preNode. next = resNode. next;
}
}
size-- ;
return resNode. element;
}
public E get ( int index) {
return node ( index) . element;
}
public E set ( int index, E data) {
Node< E> node = node ( index) ;
E res = node. element;
node. element = data;
return res;
}
public int indexOf ( E data) {
Node< E> node = first;
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( node. element) ) {
return i;
}
node = node. next;
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
Node< E> node = first;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( node) ;
node = node. next;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
2.5 双向循环链表
public class DoubleCircleList < E> extends AbstractList < E> {
public static void main ( String[ ] args) {
List< Integer> list = new DoubleCircleList < > ( ) ;
list. add ( 11 ) ;
list. add ( 22 ) ;
list. add ( 33 ) ;
list. add ( 44 ) ;
list. add ( 0 , 55 ) ;
list. add ( 2 , 66 ) ;
list. add ( list. size ( ) , 77 ) ;
System. out. println ( list) ;
list. remove ( 0 ) ;
list. remove ( 2 ) ;
list. remove ( list. size ( ) - 1 ) ;
System. out. println ( list) ;
}
private Node< E> first;
private Node< E> last;
private static class Node < E> {
E element;
Node< E> next;
Node< E> pre;
public Node ( Node< E> pre, E element, Node< E> next) {
this . element = element;
this . next = next;
this . pre = pre;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
if ( pre != null) {
s. append ( pre. element) ;
} else {
s. append ( "null" ) ;
}
s. append ( "->" ) . append ( element) . append ( "->" ) ;
if ( next != null) {
s. append ( next. element) ;
} else {
s. append ( "null" ) ;
}
return s. toString ( ) ;
}
}
public void clear ( ) {
size = 0 ;
first = null;
last = null;
}
public Node< E> node ( int index) {
rangeCheck ( index) ;
Node< E> node = null;
if ( index < ( size >> 1 ) ) {
node = first;
for ( int i = 0 ; i < index; i++ ) {
node = node. next;
}
} else {
node = last;
for ( int i = size - 1 ; i > index; i-- ) {
node = node. pre;
}
}
return node;
}
public void add ( E data) {
add ( size, data) ;
}
public void add ( int index, E data) {
rangeCheckForAdd ( index) ;
if ( index == size) {
Node< E> oldLast = last;
last = new Node < E> ( oldLast, data, first) ;
if ( oldLast == null) {
first = last;
first. next = first;
first. pre = first;
} else {
oldLast. next = last;
first. pre = last;
}
} else {
Node< E> node = node ( index) ;
Node< E> preNode = node. pre;
Node< E> newNode = new Node ( preNode, data, node) ;
node. pre = newNode;
preNode. next = newNode;
if ( node == first) {
first = newNode;
}
}
size++ ;
}
public E remove ( int index) {
rangeCheck ( index) ;
Node< E> node = first;
if ( size == 1 ) {
first = null;
last = null;
} else {
node = node ( index) ;
Node< E> preNode = node. pre;
Node< E> nextNode = node. next;
preNode. next = nextNode;
nextNode. pre = preNode;
if ( node == first) {
first = nextNode;
}
if ( node == last) {
last = preNode;
}
}
size-- ;
return node. element;
}
public E get ( int index) {
return node ( index) . element;
}
public E set ( int index, E data) {
Node< E> node = node ( index) ;
E res = node. element;
node. element = data;
return res;
}
public int indexOf ( E data) {
Node< E> node = first;
for ( int i = 0 ; i < size; i++ ) {
if ( data. equals ( node. element) ) {
return i;
}
node = node. next;
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder s = new StringBuilder ( ) ;
Node< E> node = first;
s. append ( "[" ) ;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
s. append ( ", " ) ;
}
s. append ( node) ;
node = node. next;
}
s. append ( "]" ) ;
return s. toString ( ) ;
}
}
3. 栈