本:将数组中的偶数放到奇数后面 && 输出链表倒数第k个节点
#题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
刚看到这题,我脑子乱掉了。如果new一个数组来放偶数,觉得消耗太大,不符合高效的思想。为了相对位置不变这个条件,我想到了冒泡排序,偶数在奇数前面就调换位置。
冷静下来,还是要先把暴力解法先放到前面。不然怎么体现我冒泡的好呢
#暴力解法
遍历数组,偶数拿出来放到新的数组中并删掉原数组中的偶数。遍历结束,将新数组拼接到旧数组后面
因为Java并没有提供数组的add和move函数,所以
public void reOrderArray(int [] array){
Vector<Integer> odd = new Vector<Integer>();
Vector<Integer> even = new Vector<Integer>();
for(int i = 0; i< array.length; i++){
if(array[i] % 2 == 0){
even.add(array[i]);
}else if(arrau[i] % 2 != 0){
odd.add(array[i]);
}
}
odd.addAll(even);
for(int j = 0; j<odd.length; j++){
array[j] = odd.get[j];
}
}
以上使用向量是因为可以方便的使用add函数。如果要用数组,多用几个指针也可
#冒泡方法 循环比较,如果偶数后面是奇数,则对换位置
public void reOrderArray(int[] array){
boolean isSwap = false;
for(int i = 0; i < array.length; i++){
for(int j = array.length-1; j > i; j--){
isSwap = false;
if(array[j] % 2 == 1 && array[j-1] %2 == 0){
isSwap = true;
int temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
if( !isSwap)
break;
}
}
}
#题目 输入一个链表,输出该链表中倒数第k个节点
经典的双指针法
先让第一个指针right 从头节点开始往前走k步,然后让第二个指针left 从头指针开始,left和right两个指针一起向前走,当right走到最后的时候,left指向的正是链表中倒数第k个节点
这其中需要注意的有
1. 判断链表是否为空
2. 判断k是否为0,若为0则代表要求输出倒数第0个节点,无意义
3. 判断链表是否有k个节点
public ListNode pointKfromList(ListNode head,int k){
if(head == null || k == 0) return null;
ListNode right = head;
for(int i = 0; i < k-1; i++){
if(right.next != null)
right = right.next;
else
return null;
}
ListNode left = head;
while(right.next != null){
right = right.next;
left = left.next;
}
return left;
}
堆栈
也可将链表压入栈中,push出k个节点
浙公网安备 33010602011771号