(1)翻转链表
链表节点定义:
public class ListNode {
T val;
ListNode next;
}
翻转链表关键在于处理中间状态。中间状态是有一部分链表已翻转(用head表示),一部分链表未翻转(用next表示),将next指向的节点加入到head指向的节点,
并且head移动到next的位置,next移动到next.next的位置,此时又回到中间状态。一直迭代直到next为null,此时链表全部已翻转,head指向的就是翻转链表的头。
publicListNode reverse(ListNode head) {if (head == null || head.next == null) {returnhead;
}
ListNode next=head.next;
head.next= null;while (next != null) {
ListNode tmp1=head;
head=next;
ListNode tmp2=next.next;
next.next=tmp1;
next=tmp2;
}returnhead;
}
(2)小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。
输入描述:
输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)
输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。
输入例子1:
2
3
1 10 100
4
1 2 3 4
输出例子1:
Yes
No
/**
本题关键是确定所有相邻两数相乘能被4整除的条件,设能被4整除的数个数为t_4,能被2整除不能被4整除的数个数为t_2,其它数个数为t_1,则能被4整除需要满足如下条件:
(1)t_2>0时,t_4>=t1,此时把所有t_2数排在左边,t_4/t_1间隔排在右边即可,t_4/t_1数不存在也不影响
(2)t_2=0时,t_4必须有,则t_4>=1,把t_4插入所有t_1数中间需要的t_4数量最少,此时t_4=t_1-1,所以t_4>=t1-1,t_4数量多无影响
*/
importjava.util.Scanner;public classMain {public static voidmain(String[] args) {
Scanner scanner= newScanner(System.in);int t =scanner.nextInt();for (int i = 0; i < t; i++) {int count =scanner.nextInt();int[] arr = new int[count];for (int j = 0; j < count; j++) {
arr[j]=scanner.nextInt();
}int t_4 = 0, t_2 = 0, t_1 = 0;for(intnum: arr) {int n =num;if (n % 4 == 0) {
t_4++;
}else if (n % 2 == 0) {
t_2++;
}else{
t_1++;
}
}boolean can = false;if (t_2 > 0) {
can= t_4 >=t_1;
}else{
can= t_4 > 0 && (t_4 >= t_1 - 1);
}
System.out.println(can? "Yes" : "No");
}
}
}
(3)归并两个排好序的链表
/*public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public classMain {publicListNode Merge(ListNode list1,ListNode list2) {if (list1 == null) {returnlist2;
}if (list2 == null) {returnlist1;
}
ListNode head= null, iter = null;
// 确定头元素if (list1.val
head= iter =list1;
list1=list1.next;
}else{
head= iter =list2;
list2=list2.next;
}while (list1 != null && list2 != null) {if (list1.val
iter= iter.next =list1;
list1=list1.next;
}else{
iter= iter.next =list2;
list2=list2.next;
}
}while (list1 != null) {
iter= iter.next =list1;
list1=list1.next;
}while (list2 != null) {
iter= iter.next =list2;
list2=list2.next;
}returnhead;
}
}