剑指offer(13-15)题解
13题解–调整数组顺序使奇数位于偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路解析
这里我是将奇数和偶数分别压入两个list之中,之后只要按照顺序将元素取出并且重新赋值给数组即可,只要稍微注意一下偶数压入时候的数组下标即可。
源代码
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void reOrderArray(int [] array) {
//偶数数列
List<Integer>list1=new ArrayList<Integer>();
//奇数数列
List<Integer>list2=new ArrayList<Integer>();
for(int i=0;i<array.length;i++)
{
if(array[i]%2==0)
list1.add(array[i]);
else
list2.add(array[i]);
}
for(int i=0;i<array.length;i++)
{
if(i<list2.size())
array[i]=list2.get(i);
else
array[i]=list1.get(i-list2.size());
}
}
}
14题解–链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路解析
这里我建议大家先return一下头结点看一下是什么格式的,否则可能会一直卡着,这里博主一开始以为返回的会是一个单独的结点元素,但是打印出来看了之后发现并不是这样。
他给的头结点是这样的{1,2,3,4,5}的,如果是倒数第二个节点就应该返回{4,5}这样一个结点,一开始就是因为这个一直卡着。
接下来是思路,因为是链表,没有随机存取的性质,所以我们只能一直先next找到链表一共有多少个元素,并且记住这个链表结点总数。这里我们千万不能直接通过他给定的head节点来进行遍历,否则遍历完成之后我们就没有head可以寻找了,所以我们必须重新给定一个结点,将head结点的属性赋给他,知道总数之后我们就能根据一点数学知识就能知道倒数的节点就是正数的第几个节点。之后通过循环限制次数就能找到我们的节点了
源代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k)
{
int count=1;
int flag=0;
//如果头结点为空直接返回
if(head==null)
{
return head;
}
else
{
ListNode node1=new ListNode(head.val);
node1.next=head.next;
//计算一共有多少个结点
while(node1.next!=null)
{
node1=node1.next;
count++;
}
//如果查找的节点已经超出我们链表的范围,那么我们也是直接返回null即可
if(k>count)
{
return null;
}
else
{
//计算该节点的正数位置,循环遍历即可得到
flag=count-k;
for(int i=0;i<flag;i++)
head=head.next;
return head;
}
}
}
}
15题解–反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路解析
大家一看这题就知道,必定是要用到上一题的方法了。大致思路就是我们倒序的将每个节点取出来,然后再将节点串起来,
源代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.ArrayList;
import java.util.List;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k,int count)
{
if(head==null)
{
return head;
}
else
{
//如果查找的节点已经超出链表的范围也相应的返回为空
if(k>count)
{
return null;
}
else
{
ListNode node1=new ListNode(head.val);
node1.next=head.next;
int flag=count-k;
for(int i=0;i<flag;i++)
node1=node1.next;
return node1;
}
}
}
public ListNode ReverseList(ListNode head) {
int count=1;
if(head==null)
return null;
else
{
ListNode node1=new ListNode(head.val);
node1.next=head.next;
//查找出链表的长度
while(node1.next!=null)
{
node1=node1.next;
count++;
}
//创建list存储倒序排放的节点
List<ListNode>list=new ArrayList<ListNode>();
for(int i=1;i<=count;i++)
{
//这里创建节点的时候只需要给节点赋值即可,切不可相当然的给他们的next节点同时赋值,否则陷入死循环之中
ListNode node=new ListNode(FindKthToTail(head, i, count).val);
list.add(node);
}
for(int i=0;i<list.size()-1;i++)
//这一步我们才开始将整个链表串起来
list.get(i).next=list.get(i+1);
return list.get(0);
}
}
}
都看到这里了,如果觉得对你有帮助的话,可以关注博主的公众号,新人up需要你的支持。