题目:手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低?
代码如何下:
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结果如下: