一种怪异的节点删除方式
package linked;
public class RemoveNodeOnlyByValue {
public static void main(String[] args) {
}
public static void removeNodeWired(Node node) {
}
public static void removeNode(Node node) {
if(node == null) {
return;
}
if(node.next == null) {
throw new RuntimeException("can't remove the last node");
}
node.value = node.next.value;
node.next = node.next.next;
}
}
向有序的环形单链表中插入新节点
public class InsertNum {
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(3);
Node node3 = new Node(4);
Node node4 = new Node(6);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node1;
Node newNode = insertNum(node1, 2);
Node cur = newNode;
for(int i = 1;i <= 5;i++) {
System.out.println(cur.value);
cur = cur.next;
}
}
public static Node insertNum(Node head,int num) {
Node newNode = new Node(num);
if(head == null) {
newNode.next = newNode;
return newNode;
}
Node cur = head.next;
Node pre = head;
Node next = null;
while(cur != head) {
if(pre.value <= num && num <= cur.value) {
break;
}
pre = cur;
cur = cur.next;
}
pre.next = newNode;
newNode.next = cur;
return num >= pre.value?head:newNode;
}
}
合并两个有序的链表
public class MergeTwoLinked {
public static void main(String[] args) {
Node node1 = new Node(0);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(7);
Node node5 = new Node(1);
Node node6 = new Node(3);
Node node7 = new Node(5);
Node node8 = new Node(7);
Node node9 = new Node(9);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = null;
node5.next = node6;
node6.next = node7;
node7.next = node8;
node8.next = node9;
node9.next = null;
Node newNode = merge(node1, node5);
while(newNode != null) {
System.out.println(newNode.value);
newNode = newNode.next;
}
}
public static Node merge(Node head1,Node head2) {
if(head1 == null || head2 == null) {
return head1 == null? head2:head1;
}
Node cur1 = head1;
Node cur2 = head2;
Node newNode = head1.value >= head2.value?head2:head1;
if(newNode == head2) {
cur2 = cur2.next;
}else {
cur1 = cur1.next;
}
while(cur1 != null && cur2 != null) {
if(cur1.value >= cur2.value) {
newNode.next = cur2;
cur2 = cur2.next;
}else {
newNode.next = cur1;
cur1 = cur1.next;
}
newNode = newNode.next;
}
newNode.next = cur1==null?cur2:cur1;
return head1.value >= head2.value?head2:head1;
}
}
按照左右半区的方式重新组合单链表
public class LeftRightMerge {
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = null;
Node newNode = merge(node1);
while(newNode != null) {
System.out.println(newNode.value);
newNode = newNode.next;
}
}
public static Node merge(Node head) {
if(head == null || head.next == null || head.next.next == null) {
return head;
}
Node cur1 = head;
Node cur2 = head;
while(cur1.next != null && cur1.next.next != null) {
cur2 = cur2.next;
cur1 = cur1.next.next;
}
cur2 = cur1.next == null?cur2:cur2.next;
Node mid = cur2;
cur1 = head;
Node cur1Next = null;
Node cur2Next = null;
while(cur1.next != mid) {
cur1Next = cur1.next;
cur2Next = cur2.next;
cur1.next = cur2;
cur2.next = cur1Next;
cur1 = cur1Next;
cur2 = cur2Next;
}
cur1.next = cur2;
return head;
}
}