面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
2017-11-13 00:14
951 查看
题目:手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低?
代码如何下:
main方法运行
代码1结果如下:
代码2结果如下:
代码如何下:
package com; public class LinkedList<T> { public Node<T> head = null;//链表第一个元素 public void add(T newItem) { Node newNode = new Node(newItem); if (null == head) {//添加第一个元素 head = newNode; } else {//添加后面的元素 Node<T> tail = head; while (tail.next != null) { tail = tail.next;//指针循环找到链表的最后一个元素 } tail.next = newNode;//最后一个元素指向提那家的元素 } } /** * 打印链表 */ public void display() { Node<T> node = head; int i = 0; while (node != null) { System.out.print(String.format("(%d=%d)->", i++, node.item)); node = node.next; } System.out.println(); } /** * 循环的方式逆置 * 思路:不断提那家元素为第一个节点,原来元素一次后退 */ public void reverse() { Node curr = head; Node reve = null;//逆置后当前元素的下一个元素指针变量,逆置前为第一个节点 while (curr != null) { Node temp = curr; curr = curr.next; temp.next = reve;//表示当前元素指向该元素的后面 reve = temp;// } head = reve; } int i = 0; /** * 递归的方式逆置 * 思路:如,1,2,3,4 该方法执行顺序2->1,3->2,4->3 */ public Node<T> reverse(Node<T> head) { if (head == null || head.next == null) { return head;//保证head为倒数第二个元素 } Node<T> tail = reverse(head.next);//循环找到链表的最后一个元素,辅助为tail System.out.println(head.item + " : " + tail.item); head.next.next = head; System.out.println(head.item + " : " + head.next.item + "指向" + head.next.next.item); head.next = null; System.out.println(head.item + " : " + head.item + "指向null"); i++; System.out.println("------------------"); return tail; } /** * 定义类 * * @author sj E-mail: 961784535@qq.com * @version 创建时间: 2017-11-12 下午11:10:55 * 类说明: */ class Node<T> { public T item; public Node<T> next; public Node(T item) { this.item = item; } } }
main方法运行
代码1结果如下:
代码2结果如下:
相关文章推荐
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 用JAVA实现:非递归算法在O(n)时间内将一个含有n个元素的单链表逆置,要求其辅助空间为常量
- 有一个带头结点的单链表L={a1,b1,a2,b2,...,an,bn},设计一个算法将其拆分成两个带头结点的单链表A和B,正序链表A={a1,a2,a3...,an},逆序链表B={bn,bn-1,
- 问题描述:一个长度为2n的(整型)数组元素为 a1 a2 ... an b1 b2 ... bn 要求: 用O(1)的空间代价, 在O(n)时间内把数组变成 a1 b1 a2 b2 a3 b3 ... an bn
- (学习日记)关于a1,a2,a3,...,an共n个元素依次入栈其可能出栈的排列数的计算(catalan数)
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 最大子序列问题:给定一整数序列A1,A2,A3...An(可能有负数),求A1~An的一个最大子序列Ai~Aj的和。
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 有两个排序数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,实现一个函数,把A2 插入到A1,并且是有序的。
- 从键盘读入n个整数(升序),请编写算法实现: 建立带表头结点的单链表; 显示单链表,(形如:H->10->20->30->40); 在有序单链表中插入新的数据元素x; 将单链表就地逆
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn ) 概论思想(perfect shuffle 算法)