Java与算法(6)
题目:
将单链表按某值划分为左边小,中间相等,右边大的形式。
如:
9-0-4-5-1,按3来划分
结果就是1-0-4-9-5
对部分内部节点顺序不做要求
public class DivideLink {
public static class Node {
int data;
Node next;
public Node (int data) {
this .data = data;
}
}
public Node divide (Node head,int p) {
int i=0 ;
Node node = head;
while (node!=null ) {
i++;
node=node.next;
}
Node[] nodes = new Node[i];
node=head;
for (int j=0 ;j<nodes.length;j++) {
nodes[j] = node;
node=node.next;
}
sort(nodes, p);
for (int j=1 ;j<nodes.length;j++) {
nodes[j-1 ].next = nodes[j];
}
nodes[i-1 ].next = null ;
return nodes[0 ];
}
public void printLink (Node head) {
while (head!=null ) {
System.out.println(head.data+" " );
head=head.next;
}
System.out.println();
}
public void sort (Node[] nodes,int p) {
int index = 0 ;
int big = nodes.length;
int small = -1 ;
while (index!=big) {
if (nodes[index].data<p) {
swap(nodes, ++small, index++);
} else if (nodes[index].data == p) {
index++;
} else {
swap(nodes, --big, index);
}
}
}
public void swap (Node[] nodes ,int a,int b) {
Node tNode = nodes[a];
nodes[a] = nodes[b];
nodes[b] = tNode;
}
public static void main (String[] args) {
Node node1 = new Node(9 );
node1.next = new Node(0 );
node1.next.next = new Node(4 );
node1.next.next.next = new Node(5 );
node1.next.next.next.next = new Node(1 );
DivideLink divideLink = new DivideLink();
Node node = divideLink.divide(node1, 3 );
divideLink.printLink(node);
}
}
题目:
两个链表相加生成新链表
如:
9-3-7和6-3
生成1-0-0-0
public class AddLink {
public static class Node {
int data;
Node next;
public Node (int data) {
this .data = data;
}
}
public void printLink (Node head) {
while (head!=null ) {
System.out.println(head.data+" " );
head=head.next;
}
System.out.println();
}
public Node add (Node node1,Node node2) {
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
while (node1!=null ) {
s1.push(node1.data);
node1=node1.next;
}
while (node2!=null ) {
s2.push(node2.data);
node2=node2.next;
}
int ca = 0 ;
int n1 = 0 ;
int n2 = 0 ;
Node node = null ;
Node pre = null ;
int n=0 ;
while (!s1.isEmpty() || !s2.isEmpty()) {
n1 = s1.isEmpty()?0 :s1.pop();
n2 = s2.isEmpty()?0 :s2.pop();
n=n1+n2+ca;
pre = node;
node = new Node(n%10 );
node.next = pre;
ca = n/10 ;
}
if (ca == 1 ) {
pre = node;
node = new Node(1 );
node.next=pre;
}
return node;
}
public static void main (String[] args) {
Node node1 = new Node(1 );
node1.next = new Node(3 );
node1.next.next = new Node(7 );
Node node2 = new Node(2 );
node2.next = new Node(3 );
AddLink dAddLink = new AddLink();
Node node = dAddLink.add(node1, node2);
dAddLink.printLink(node);
}
}
题目:
将单链表的每k个节点逆序
如:
1-2-3-4-5-6-7-8,k=3
结果:
3-2-1-6-5-4-7-8
public class ReverseKNode {
public static class Node {
int data;
Node next;
public Node (int data) {
this .data = data;
}
}
public void printLink (Node head) {
while (head!=null ) {
System.out.println(head.data+" " );
head=head.next;
}
System.out.println();
}
public Node reverse (Node head,int k) {
Node cur = head;
Node newhead = head;
Node pre = null ;
Node next = null ;
Stack<Node> stack = new Stack<>();
while (cur!=null ) {
next = cur.next;
stack.push(cur);
if (stack.size()==k) {
pre = resignl(stack, pre, next);
newhead = newhead == head?cur:newhead;
}
cur = next;
}
return newhead;
}
public Node resignl (Stack<Node> stack,Node left,Node right) {
Node cur = stack.pop();
if (left!=null ) {
left.next = cur;
}
Node next = null ;
while (!stack.isEmpty()) {
next = stack.pop();
cur.next = next;
cur = next;
}
cur.next = right;
return cur;
}
public static void main (String[] args) {
Node node1 = new Node(1 );
node1.next = new Node(3 );
node1.next.next = new Node(5 );
node1.next.next.next = new Node(7 );
node1.next.next.next.next = new Node(9 );
node1.next.next.next.next.next = new Node(11 );
node1.next.next.next.next.next.next = new Node(13 );
node1.next.next.next.next.next.next.next = new Node(15 );
ReverseKNode kNode = new ReverseKNode();
kNode.printLink(node1);
Node node = kNode.reverse(node1, 3 );
System.out.println("------" );
kNode.printLink(node);
}
}