链表专题
1. 将单链表划分成左边大右边小中间相等的形式
将节点遍历放入数组中,数组partion,然后再连接起来。
package zuochengyun;
public class ListPartition {
public static class Node {
private int data;
private Node next;
public Node (int data) {
this .data = data;
}
}
/**
* 利用数组完成 空间复杂度0(n)
*
* @param number
* @param head
* @return
*/
public static Node listpartion1 (int number, Node head) {
int i = 0 ;
Node cur = head;
while (cur != null ) {
i++;
cur = cur.next;
}
Node[] a = new Node[i];
i = 0 ;
cur = head;
while (cur != null ) {
a[i] = cur;
i++;
cur = cur.next;
}
arrpartion(a, number);
for (i = 1 ; i < a.length; i++) {
a[i - 1 ].next = a[i];
}
a[i - 1 ].next = null ;
return a[0 ];
}
private static void arrpartion (Node[] a, int pivot) {
int small = -1 ;
int big = a.length-1 ;
int i = 0 ;
while (i != big) {
if (a[i].data < pivot) {
swap(a, ++small,i++);
} else if (a[i].data == pivot) {
i++;
} else {
swap(a, big--,i);
}
}
}
private static void swap (Node[] a, int i, int j) {
Node temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void print (Node head) {
while (head != null ) {
System.out.print("-" + head.data);
head = head.next;
}
System.out.println();
}
public static void main (String[] args) {
Node head1 = new Node(7 );
head1.next = new Node(9 );
head1.next.next = new Node(1 );
head1.next.next.next = new Node(8 );
head1.next.next.next.next = new Node(5 );
head1.next.next.next.next.next = new Node(2 );
head1.next.next.next.next.next.next = new Node(5 );
print(head1);
Node head = listpartion1(5 , head1);
print(head);
}
}
保证链表的稳定性
public static Node listpartion2 (Node head,int number) {
if (head==null )
return null ;
Node lessH=null ;
Node lessT=null ;
Node equalH=null ;
Node equalT=null ;
Node moreH=null ;
Node moreT=null ;
while (head!=null ) {
if (head.data<number) {
if (lessH==null ) {
lessH=head;
lessT=head;
}else {
lessT.next=head;
lessT=lessT.next;
}
}else if (head.data==number){
if (equalH==null ) {
equalH=head;
equalT=head;
}else {
equalT.next=head;
equalT=equalT.next;
}
}else {
if (moreH==null ) {
moreH=head;
moreT=head;
}else {
moreT.next=head;
moreT=moreT.next;
}
}
head=head.next;
}
/**
* 不是很清楚
*/
/**
* 小段链接!
*/
if (lessT!=null ) {
lessT=equalH;
equalT= equalT==null ?lessT:equalT;
}
if (equalT!=null ) {
equalT=moreH;
}
return null !=lessH?lessH:null !=equalH?equalH:moreH;
}