一、单向链表
创建节点对象
class Node {
int no;
Node next;
public Node ( int no) {
this . no = no;
}
}
实现链表的建立、插入、遍历以及删除
class BuildNode {
private Node head = new Node ( 0 ) ;
public void buildByLast ( Node node) {
Node temp = head;
while ( temp. next!= null ) {
temp = temp. next;
}
temp. next = node;
}
public void buildByOrder ( Node node) {
Node temp = head;
boolean flag = true ;
while ( temp. next!= null ) {
if ( temp. next. no>= node. no) {
flag = false ;
break ;
}
temp = temp. next;
}
if ( flag) {
temp. next = node;
} else {
node. next = temp. next;
temp. next = node;
}
}
public void deleteNode ( int n) {
if ( head. next== null ) {
System . out. println ( "列表为空" ) ;
return ;
}
boolean flag = true ;
Node temp = head;
while ( temp. next != null ) {
if ( temp. next. no == n) {
flag = false ;
break ;
}
temp = temp. next;
}
if ( flag) {
System . out. println ( "没有找到该节点" ) ;
return ;
}
temp. next = temp. next. next;
}
public void getAll ( ) {
Node temp = head. next;
while ( temp!= null ) {
System . out. print ( temp. no + " " ) ;
temp = temp. next;
}
System . out. print ( "\n" ) ;
}
}
二、单向链表的其他操作
链表反转
public void reverseNode ( ) {
if ( head. next== null || head. next. next== null ) {
return ;
}
Node n1 = head. next;
Node n2 = null ;
Node n3 = new Node ( 0 ) ;
while ( n1!= null ) {
n2 = n1. next;
n1. next = n3. next;
n3. next = n1;
n1 = n2;
}
head. next = n3. next;
}
合并两个有序的链表
public Node conbine ( Node head, Node head2) {
Node temp1 = head. next;
Node temp2 = head2. next;
Node pre1 = head;
Node record = null ;
while ( temp1!= null && temp2!= null ) {
if ( temp1. no>= temp2. no) {
record = temp2. next;
pre1. next = temp2;
temp2. next = temp1;
pre1 = pre1. next;
temp2 = record ;
} else {
temp1 = temp1. next;
pre1 = pre1. next;
}
}
if ( temp1== null ) {
pre1. next = temp2;
}
return head;
}
public Node conbine ( Node l1, Node l2) {
ListNode pre = new ListNode ( - 1 ) ;
ListNode t = pre;
while ( l1!= null&& l2!= null) {
if ( l1. val>= l2. val) {
pre. next = l2;
l2 = l2. next;
} else {
pre. next = l1;
l1 = l1. next;
}
pre = pre. next;
}
if ( l2!= null) {
pre. next = l2;
}
if ( l1!= null) {
pre. next = l1;
}
return t. next;
}
三、双向链表
private Node1 head = new Node1 ( 0 ) ;
public void buildByLast ( Node1 node) {
Node1 temp = head;
while ( temp. next!= null ) {
temp = temp. next;
}
node. pre = temp;
temp. next = node;
}
public void deleteNode ( int n) {
if ( head. next== null ) {
System . out. println ( "列表为空" ) ;
return ;
}
boolean flag = true ;
Node1 temp = head. next;
while ( temp != null ) {
if ( temp. no == n) {
flag = false ;
break ;
}
temp = temp. next;
}
if ( flag) {
System . out. println ( "没有找到该节点" ) ;
return ;
}
temp. pre. next = temp. next;
if ( temp. next!= null ) {
temp. next. pre = temp. pre;
}
}
public void getAll ( ) {
Node1 temp = head. next;
while ( temp!= null ) {
System . out. print ( temp. no + " " ) ;
temp = temp. next;
}
System . out. print ( "\n" ) ;
}
四、环形链表解决约瑟夫问题
class BuildLink3 {
private CircleLink first = null ;
public void build ( int nums) {
CircleLink cur = null ;
for ( int i= 1 ; i<= nums; i++ ) {
CircleLink circleLink = new CircleLink ( i) ;
if ( i== 1 ) {
first = circleLink;
circleLink. next = first;
} else {
cur. next = circleLink;
circleLink. next = first;
}
cur = circleLink;
}
}
public void deleteNode ( int k) {
int i = 1 ;
CircleLink cur = first;
CircleLink data = first;
while ( data. next!= first) {
data = data. next;
}
while ( true ) {
if ( data == cur) {
break ;
}
if ( i== k) {
System . out. println ( cur. no) ;
data. next = cur. next;
cur = cur. next;
i= 1 ;
continue ;
}
i++ ;
cur = cur. next;
data = data. next;
}
}
public void getAll ( ) {
CircleLink data = first;
while ( data. next!= first) {
System . out. println ( data. no) ;
data = data. next;
}
System . out. println ( data. no) ;
}
}