java 链表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 链表相关的知识,希望对你有一定的参考价值。
用递归方法 输出已给链表中EverySecond 元素 组成新链表 并输出
public class Node<T>
public T value;
public Node<T> next;
public Node(T value, Node<T> next)
this.value = value;
this.next = next;
<Node Class不可以修改>
递归程序
import java.util.*;
public class EverySecond
public <T>Node<T> everySecond(Node<T> list)
Node<T> n=new Node(list.value,list.next);
if(!(list.next==null))
list=list.next;
n.value=list.value;
if(list==null &&list.next==null)
return n;
else
list=list.next;
return everySecond(list);
Driver 程序
public class EverySecondDriver
public static void main(String[] args)
// Build list
char[] values = 'A','B','C','D','E','F','G';
Node<Character> list = null;
for (int i = values.length-1; i >= 0; i--)
list = new Node<Character>(values[i],list);
// Print list
System.out.print("List:");
for (Node<Character> n = list; n != null; n = n.next)
System.out.print(" "+n.value);
System.out.println();
// Get new list, with every second element
EverySecond es = new EverySecond();
Node<Character> result = es.everySecond(list);
// Print result
System.out.print("Result:");
for (Node<Character> n = result; n != null; n = n.next)
System.out.print(" "+n.value);
System.out.println();
麻烦帮忙看看错误,究竟是什么原因
例如 给定链表 A B C D E F G
输出链表 B D F
主要问题是
1 在递归语句 得到 NUllPointException
2 每次递归时候建立新的链表,旧的数据无法保存
public T value;
public Node<T> next;
public Node(T value, Node<T> next)
this.value = value;
this.next = next;
public class EverySecond
public <T> Node<T> everySecond(Node<T> list)
Node<T> tmp = new Node<T>(list.value, null);
if (list.next != null)
tmp.next = everySecond(list.next);
return tmp;
public class EverySecondDriver
public static void main(String[] args)
// Build list
char[] values = 'A', 'B', 'C', 'D', 'E', 'F', 'G';
Node<Character> list = null;
for (int i = values.length - 1; i >= 0; i--)
list = new Node<Character>(values[i], list);
// Print list
System.out.print("List:" + list);
for (Node<Character> n = list; n != null; n = n.next)
System.out.print(" " + n.value);
System.out.println();
// Get new list, with every second element
EverySecond es = new EverySecond();
Node<Character> result = es.everySecond(list);
// Print result
System.out.print("Result:" + result);
for (Node<Character> n = result; n != null; n = n.next)
System.out.print(" " + n.value);
System.out.println();
参考技术A 初看没看懂程序什么意思...
不过
if (list == null && list.next == null)
这一行明显的有问题
如果list为空了,还要判断list.next,会报空指针异常的。
是不是应该把&&改成|| 参考技术B
if(list==null &&list.next==null)//这一行有错误,应该是list.next==null
return n;
else
list=list.next;
return everySecond(list);
JAVA基础——链表结构之双端链表
双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用 如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作 但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列. 下面的双端链表类.有几个重要方法. insertFirst(插入首链结点) 这个方法与上篇博文的单链表是基本一样的.唯一区别就是,多了个last引用的操作.正常由于last是指向尾链结点的引用,所以插入首链结点是与他无关的. 但当链结点为空(isEmpty())的时候,这会追加的链结点既是首链结点又是尾链结.所以需要将last指向它.
insertLast(插入尾链结点) 插入尾部链结点也是与普通的理解基本一致,所以不多赘述.唯一也要注意的是链结点为空(isEmpty())的时候.需要将first指向该链结点.
看下插入尾部链结点的引用指向: deleteFirst(删除首部链结点) 这个需要注意的就是,如果仅剩下一个链结点.那么删除后last就应该指向null了.
最后这个代码如下:
代码运行结果为:
链表的效率 这里顺便谈下链表和数组相比效率的优越性.在表头插入和删除的速度都很快,因为只需要改变一下引用所以花费O(1)的时间. 平均起来查找,删除和在指定节点后插入数据都需要搜索一半的链结点.需要O(N)次比较和数组一样.然由于链表删除插入的时候 不需要像数组那种元素的移动.所以效率还是要优于数组. 还有一点就是链表的内存可以随时的扩展内存.而数组的内存是一开始就固定好的.这样就会导致数组的效率和可用性大大下降.
以上是关于java 链表的主要内容,如果未能解决你的问题,请参考以下文章