刚看到这题,我脑子乱掉了。如果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;
}
}
}
先让第一个指针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个节点
原文:https://www.cnblogs.com/cherry-BAIL/p/13006477.html