java-单链表 面试题 互换元素

问题描述

单链表 面试题 互换元素

单链表 1 2 3 4 ... n-1 n,变成1 n 3 n-2 ....4 n-1 2,Java如何实现

解决方案

你的互换没有规律啊
比如说n=9
原来是 1 2 3 4 5 6 7 8 9
1 9 3 7 ... 4 8 2
5和6怎么排?

解决方案二:

看上去是间隔交换,2,4,6.。。交换

解决方案三:

按顺序遍历,奇数位不变,偶数为变为n-(x-2),其中n为原数列中的n,x为当前遍历的序号。

解决方案四:

好吧,首先我想你问的问题并不是真的整数1 2 3...而是下标为1,2,3的数组进行重排,否则答案像autocyz给的,太,简单了。
其实你得先理解题意,1...n,你得知道n是奇数还是偶数,否则会得到错误的结论,如果是偶数,得到oyljerry的结论。是奇数,这里会会像caozhy说的一样,没有规律。哈哈。所以问过面试官,确认是偶数先(面试需要多问问题,明确考官的真实意图,也反映你的确在思考问题)
最后因为是面试题,你先考虑面试的要素,1.算法复杂度最低,一般来说o(1)最好,但是这个题目O(1)只有作弊,采用一个数据结构可以做到,O(n)是其次,一般面试题的正解都是O(n)算法。这个题目有O(n)解.这里考虑到是单链表,所以o(N)算法是你需要的,你可以考虑一下
1. 怎么在o(n)算法头尾交换,其实就是倒排,这个我想也不难对你,就是另外建一个链表,找到一个插入到链表头
2. 怎么只做偶数部分,其实也不复杂,2个指针,一个奇数指针,它读到的按原顺序写入一个奇数链表,一个偶数指针,利用1里面写入一个倒排的链表
3. 现在你有2个链表,按照两两合并弄成一个指针
我们看看复杂度:
1. 时间复杂度, 读第一次,得到2个新指针,一次遍历,n个操作,第二次,合并,n个操作,就是2n,复杂度仍然是O(N)
2. 空间复杂度,只要一个新链表,4个指针,N+4个指针大小
另外也许面试官会问:你能做到IN-place么,你理解一下in-place是什么意思,其实时间复杂度不会改变,而空间复杂度是4个指针。

解决方案五:

好吧,首先我想你问的问题并不是真的整数1 2 3...而是下标为1,2,3的数组进行重排,否则答案像autocyz给的,太,简单了。
其实你得先理解题意,1...n,你得知道n是奇数还是偶数,否则会得到错误的结论,如果是偶数,得到oyljerry的结论。是奇数,这里会会像caozhy说的一样,没有规律。哈哈。所以问过面试官,确认是偶数先(面试需要多问问题,明确考官的真实意图,也反映你的确在思考问题)
最后因为是面试题,你先考虑面试的要素,1.算法复杂度最低,一般来说o(1)最好,但是这个题目O(1)只有作弊,采用一个数据结构可以做到,O(n)是其次,一般面试题的正解都是O(n)算法。这个题目有O(n)解.这里考虑到是单链表,所以o(N)算法是你需要的,你可以考虑一下
1. 怎么在o(n)算法头尾交换,其实就是倒排,这个我想也不难对你,就是另外建一个链表,找到一个插入到链表头
2. 怎么只做偶数部分,其实也不复杂,2个指针,一个奇数指针,它读到的按原顺序写入一个奇数链表,一个偶数指针,利用1里面写入一个倒排的链表
3. 现在你有2个链表,按照两两合并弄成一个指针
我们看看复杂度:
1. 时间复杂度, 读第一次,得到2个新指针,一次遍历,n个操作,第二次,合并,n个操作,就是2n,复杂度仍然是O(N)
2. 空间复杂度,只要一个新链表,4个指针,N+4个指针大小。
另外也许面试官会问:你能做到IN-place么,你理解一下in-place是什么意思,其实时间复杂度不会改变,而空间复杂度是4个指针

时间: 2024-09-07 13:40:08

java-单链表 面试题 互换元素的相关文章

Java单链表基本操作的实现_java

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提宝贵

Java单链表的实现代码_java

下面是小编给大家分享的一个使用java写单链表,有问题欢迎给我留言哦. 首先定义一个Node类 public class Node { protected Node next; //指针域 public int data;//数据域 public Node( int data) { this. data = data; } //显示此节点 public void display() { System. out.print( data + " "); } } 接下来定义一个单链表,并实现

java单链表存储的冒泡排序算法

问题描述 请各位大神给我一个标准的java单链表存储的冒泡排序算法,谢啦 解决方案 解决方案二:/***单向链表排序*@author*@versionMay17,2013*@seeLinkedCompositor*@since*/publicclassLinkedCompositor{publicstaticvoidmain(String[]args){//自定义链表头,头结点比较特殊,不参与排序MyLinkedUnitheader=newMyLinkedUnit(-1,null);//初始化链

JAVA实现链表面试题_java

这份笔记整理了整整一个星期,每一行代码都是自己默写完成,并测试运行成功,同时也回顾了一下<剑指offer>这本书中和链表有关的讲解,希望对笔试和面试有所帮助. 本文包含链表的以下内容: 1.单链表的创建和遍历 2.求单链表中节点的个数 3.查找单链表中的倒数第k个结点(剑指offer,题15) 4.查找单链表中的中间结点 5.合并两个有序的单链表,合并之后的链表依然有序[出现频率高](剑指offer,题17) 6.单链表的反转[出现频率最高](剑指offer,题16) 7.从尾到头打印单链表(

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在Java中这样定义单链表结构 [java] view plain copy <span style="fon

Java单链表归并排序

概念 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表. 归并排序基本原理 通过对若干个有序结点序列的归并来实现排序. 所谓归并是指将若干个已排好序的部分合并成一个有序的部分. 单链表实现归并排序 找到中间点拆分链表 //找到中间点,然后分割 public ListNode getMiddle(ListNode head) { if (head == null) { return

Java单链表实现快速排序

普通快排的思路 选择1个结点为中心点,保证中心点左边比中心点小,中心点右边比中心点大即可.这就是一次快排,确定一个数的正确位置,然后进行递归. 单链表的实现为 使第一个节点为中心点 创建2个指针(p,q),p指向头结点,q指向p的下一个节点 q开始遍历,如果发现q的值比中心点的值小,则此时p=p->next,并且执行当前p的值和q的值交换,q遍历到链表尾即可 把头结点的值和p的值执行交换.此时p节点为中心点,并且完成1轮快排 使用递归的方法即可完成排序 具体函数实现 public void qu

【算法】Java单链表逆转

单链表逆转置的递归与非递归方式 Node类 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 先看递归求解: public ListNode reverse1(ListNode head) { // 当为空或者本节点为末尾节点的时候 if (head == null || head.next == null) return head; ListNode temp = head.next;

java实现数据结构单链表示例(java单链表)_java

复制代码 代码如下: /** * 单向链表 * */public class NodeList<E> { private static class Node<E> { // 节点类  E data; // 节点上的数据  Node<E> next; // 指向下一个节点   Node(E e) {   this.data = e;   this.next = null;  } }  private Node<E> head; // 链表的头节点 privat