反转部分单向链表
public class ReversePartLinked {
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);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;
Node newNode = reversePartLinked(node1, 2, 5);
while(newNode != null) {
System.out.println(newNode.value);
newNode = newNode.next;
}
}
public static Node reversePartLinked(Node head,int from,int to) {
int count = 0;
Node cur = head;
Node fpre = null;
Node tpos = null;
while(cur != null) {
count++;
fpre = count == from - 1?cur:fpre;
tpos = count == to + 1?cur:tpos;
cur = cur.next;
}
if(head == null || from >= to || from < 1 || to > count) {
return head;
}
Node pre = fpre == null?head:fpre.next;
Node cur2 = pre.next;
pre.next = tpos;
Node next = null;
while(cur2 != tpos) {
next = cur2.next;
cur2.next = pre;
pre = cur2;
cur2 = next;
}
if(fpre == null) {
return pre;
}
fpre.next = pre;
return head;
}
}
判断一个单向链表是否是回文结构
public class PalindromeLinked {
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(2);
Node node7 = new Node(1);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
node7.next = null;
boolean palindrome01 = isPalindrome01(node1);
boolean palindrome02 = isPalindrome02(node1);
System.out.println(palindrome01 +" "+palindrome02);
while(node1 != null) {
System.out.println(node1.value);
node1 = node1.next;
}
}
public static boolean isPalindrome01(Node head) {
if(head == null || head.next == null) {
return true;
}
if(head.next.next == null) {
return head.next.value == head.value;
}
Stack<Integer> stack = new Stack<>();
Node slow = head;
Node quick = head;
while(quick.next != null && quick.next.next != null) {
stack.add(slow.value);
slow = slow.next;
quick = quick.next.next;
}
if(quick.next != null) {
stack.add(slow.value);
}
slow = slow.next;
while(!stack.isEmpty()) {
if(stack.pop() != slow.value){
return false;
}
slow = slow.next;
}
return true;
}
public static boolean isPalindrome02(Node head) {
if(head == null || head.next == null) {
return true;
}
Node node1 = head;
Node node2 = head;
while(node2.next != null && node2.next.next != null) {
node1 = node1.next;
node2 = node2.next.next;
}
Node node3 = null;
node2 = node1.next;
node1.next = null;
while(node2 != null) {
node3 = node2.next;
node2.next = node1;
node1 = node2;
node2 = node3;
}
boolean flag = true;
node3 = node1;
node2 = node1;
node1 = head;
while(node1 != null && node2 != null) {
if(node1.value != node2.value) {
flag = false;
break;
}
node1 = node1.next;
node2 = node2.next;
}
node1 = null;
node2 = node3;
while(node2 != null) {
node3 = node2.next;
node2.next = node1;
node1 = node2;
node2 = node3;
}
return flag;
}
}
将单向链表按某值划分为左边小、中间相等、右边大的形式
public class LinkedPartition {
public static void main(String[] args) {
Node node1 = new Node(5);
Node node2 = new Node(0);
Node node3 = new Node(4);
Node node4 = new Node(6);
Node node5 = new Node(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;
Node newNode = linkedPartitionSolution02(node1, 5);
while(newNode != null) {
System.out.println(newNode.value);
newNode = newNode.next;
}
}
public static Node linkedPartitionSolution01(Node head,int pivot) {
if(head == null || head.next == null) {
return head;
}
Node cur = head;
int count = 0;
while(cur != null) {
count++;
cur = cur.next;
}
cur = head;
Node[] nodeArr = new Node[count];
for(int i = 0;i < nodeArr.length ;i++) {
nodeArr[i] = cur;
cur = cur.next;
}
int smaller = -1;
int bigger = nodeArr.length;
for(int i = 0;i < bigger;i++) {
if(nodeArr[i].value < pivot) {
smaller++;
Node temp = nodeArr[smaller];
nodeArr[smaller] = nodeArr[i];
nodeArr[i] = temp;
}else if(nodeArr[i].value > pivot) {
bigger--;
Node temp = nodeArr[bigger];
nodeArr[bigger] = nodeArr[i];
nodeArr[i] = temp;
i--;
}
}
for(int i = 0;i < nodeArr.length-1;i++) {
nodeArr[i].next = nodeArr[i+1];
}
nodeArr[nodeArr.length - 1].next = null;
return nodeArr[0];
}
public static Node linkedPartitionSolution02(Node head,int pivot) {
if(head == null || head.next == null) {
return head;
}
Node cur = head;
Node smaller = null;
Node hSmaller = null;
Node equal = null;
Node hEqual = null;
Node bigger = null;
Node hBigger = null;
Node next = null;
while(cur != null) {
next = cur.next;
cur.next = null;
if(cur.value > pivot) {
if(hBigger == null) {
bigger = cur;
hBigger = cur;
}else {
bigger.next = cur;
bigger = cur;
}
}else if(cur.value == pivot) {
if(hEqual == null) {
equal = cur;
hEqual = cur;
}else {
equal.next = cur;
equal = cur;
}
}else {
if(hSmaller == null) {
smaller = cur;
hSmaller = cur;
}else {
smaller.next = cur;
smaller = cur;
}
}
cur = next;
}
if(hSmaller != null) {
if(hEqual != null) {
smaller.next = hEqual;
equal.next = hBigger;
}else {
smaller.next = hBigger;
}
return hSmaller;
}
if(hEqual != null) {
equal.next = hBigger;
return hEqual;
}
return hBigger;
}
}