- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个 LinkedList,我想打印所有值及其先前的列表值。我收到 NullPointerException。我该如何修正程序?
我有一些额外的方法,但如果我觉得它们与程序的上下文无关,我可以删除它们。向前打印链接列表的方法名为 display,而打印包含先前值的值的方法名为 displayInDetails。
谢谢。
import java.util.* ;
class Node {
public int data;
public Node next;
public Node previous;
public Node( int data ){
this.data = data;
}
public Node (){
}
public void display(int data ){
System.out.print( Integer.toString(data));
}
}
class Result {
public Node node;
public int count;
public Result( Node n, int c) {
node = n;
count = c;
}
}
class IntWrapper {
public int value = 0;
}
public class LinkedList {
public Node head;
public Node tail;
public Node current;
LinkedList(){
head = null;
tail = null;
current = null;
}
public boolean isEmpty(){
return(head == null);
}
public void insertToTail( int data){
Node newNode = new Node(data);
Node tmp = tail;
//
if (head == null ){
head = newNode;
tail = head;
}
else {
tail.next = newNode;
tail = newNode;
}
tail.previous = tmp;
head.previous = null;
}
public Node removeFirst(){
Node linkReference = head;
if(!isEmpty()){
// Removes the Link from the List
head = head.next;
} else {
System.out.println("Empty LinkedList");
}
return linkReference;
}
public void display(){
Node current = head;
List<Node> myNodeList = new ArrayList<Node>();
System.out.println();
while(current != null){
System.out.print( current.data );
if ( myNodeList.contains(current))
break;
myNodeList.add(current);
if (current.next != null)
System.out.print(" -> ");
current = current.next;
}
System.out.println();
}
public void displayInDetails(){
Node current = head;
List<Node> myNodeList = new ArrayList<Node>();
System.out.println();
while(current != null){
if ( current.previous != null || current != null )
System.out.println( current.previous.data + " <-"+ current.data ) ;
if ( myNodeList.contains(current))
break;
myNodeList.add(current);
current = current.next;
}
System.out.println();
}
public int getLength ( ){
int length = 0;
// LinkedList ll = this;
if (this== null)
return -1;
Node current = this.head;
while( current != null){
length += 1;
current = current.next;
}
return length;
}
public Node getNode( int data){
Node theLink = head;
if(!isEmpty()){
while(theLink.data != data ){
// Checks if at the end of the LinkedList
if(theLink.next == null){
// Got to the end of the Links in LinkedList
// without finding a match
return null;
} else {
// Found a matching Link in the LinkedList
theLink = theLink.next;
}
}
} else {
System.out.println("Empty LinkedList");
}
return theLink;
}
public Node removeLink(int data){
Node currentLink = head;
Node previousLink = head;
// Keep searching as long as a match isn't made
while(currentLink.data != data){
// Check if at the last Link in the LinkedList
if(currentLink.next == null){
// bookName not found so leave the method
return null;
} else {
// We checked here so let's look in the
// next Link on the list
previousLink = currentLink;
currentLink = currentLink.next;
}
}
if(currentLink == head){
// If you are here that means there was a match
// in the reference stored in head in the
// LinkedList so just assign next to head
head = head.next;
}
else {
// If you are here there was a match in a Link other
// than the head. Assign the value of next for
// the Link you want to delete to the Link that's
// next previously pointed to the reference to remove
System.out.println("FOUND A MATCH");
System.out.println("currentLink: " + currentLink);
System.out.println("head: " + head);
previousLink.next = currentLink.next;
}
return currentLink;
}
/* question 2-1 */
/* remove the duplicates from an unsorted linked list */
public static void deleteDupsB( Node head) {
if (head == null) return;
Node current = head;
while (current != null) {
/* Remove all future nodes that have the same value */
Node runner = current;
while (runner.next != null) {
if (runner.next.data == current.data) {
runner.next = runner.next.next;
} else {
runner = runner.next;
}
}
current = current.next;
}
}
public static void deleteDupsA( Node n) {
HashSet<Integer> set = new HashSet<Integer>();
Node previous = null;
while (n != null) {
if (set.contains(n.data)) {
previous.next = n.next;
} else {
set.add(n.data);
previous = n;
}
n = n.next;
}
}
public static void deleteDupsC( Node head) {
if (head == null) return;
Node previous = head;
Node current = previous.next;
while ( current != null ) {
// Look backwards for dups, and remove any that you see.
Node runner = head;
while (runner != current) {
if (runner.data == current.data) {
Node tmp = current.next;
previous.next = tmp;
current = tmp;
/*
We know we can't have more than one dup preceding
our element since it would have been removed
earlier.
*/
break;
}
runner = runner.next;
}
/* If runner == current, then we didn't find any duplicate
* elements in the previous for loop. We then need to
* increment current.
* If runner != current, then we must have hit the ‘break’
* condition, in which case we found a dup and current has
* already been incremented.*/
if (runner == current) {
previous = current;
current = current.next;
}
}
}
/* end of question 2-1 */
/* question 4-2 */
/* get the n-th number from last in a linked list */
public static Node nthToLast( Node head, int n) {
Node p1 = head;
Node p2 = head;
if (n <= 0) return null;
// Move p2 n nodes into the list. Keep n1 in the same position.
for (int i = 0; i < n - 1; i++) {
if (p2 == null) {
return null; // Error: list is too small.
}
p2 = p2.next;
}
if (p2 == null) { // Another error check.
return null;
}
// Move them at the same pace. When p2 hits the end,
// p1 will be at the right element.
while (p2.next != null) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
public static Result nthToLastR3Helper( Node head, int k) {
if (head == null) {
return new Result(null, 0);
}
Result res = nthToLastR3Helper( head.next, k);
if (res.node == null) {
res.count++;
if (res.count == k) {
res.node = head;
}
}
return res;
}
public static Node nthToLastR3( Node head, int k) {
Result res = nthToLastR3Helper(head, k);
if (res != null) {
return res.node;
}
return null;
}
public static int nthToLastR1( Node head, int n) {
if (n == 0 || head == null) {
return 0;
}
int k = nthToLastR1(head.next, n) + 1;
if (k == n) {
System.out.println(n + "th to last node is " + head.data);
}
return k;
}
/* question 4-2 end */
/* question 2-3 */
/* write an algorithm to delete a node to middle of a singly linked list given only access to that node */
public static boolean deleteNode( Node n) {
if (n == null || n.next == null) {
return false; // Failure
}
Node next = n.next;
n.data = next.data;
n.next = next.next;
return true;
}
/* question 2-4 */
/* add values in two linked list */
public int addListsHelper( Node first, Node second ){
int addvalue = 0 ;
if( first != null ){
addvalue += first.data;
}
if ( second!= null ){
addvalue += second.data;
}
return addvalue;
}
private void addLists( LinkedList l1, LinkedList l2) {
if (l1 == null && l2 == null) {
return;
}
int carry = 0 ;
Node curr1 = l1.head;
Node curr2 = l2.head;
// Node res1 = result.head;
int [] f_result = null;
while ( curr1 != null ||curr2 != null) {
int ll = addListsHelper( curr1 , curr2 );
System.out.println("carry = "+ carry );
int tt = (ll+carry) % 10;
// carry =0;
if ( ll >= 10)
carry =1;
curr1 = curr1.next;
curr2 = curr2.next;
System.out.println(" "+ tt );
}
}
/* end of addLists */
public static Node findBeginning( Node head) {
Node slow = head;
Node fast = head;
// Find meeting point
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
break;
}
}
// Error check - there is no meeting point, and therefore no loop
if (fast == null || fast.next == null) {
return null;
}
/* Move slow to Head. Keep fast at Meeting Point. Each are k steps
/* from the Loop Start. If they move at the same pace, they must
* meet at Loop Start. */
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
// Both now point to the start of the loop.
return fast;
}
public void createLoop( int disToTail){
if (this.getLength() < disToTail )
return;
else {
Node curr = nthToLast( head, disToTail );
tail.next = curr;
}
}
public static void main(String[] args) {
LinkedList myLL = new LinkedList();
int length = 10;
// insert values ( int ) to the tail of the linked list
for ( int j=0; j < length; j++ ){
myLL.insertToTail( j*2 );
}
myLL.display();
System.out.println();
/* display the linked list with it's previous, current and the next values */
myLL.displayInDetails();
System.out.println();
// int list_length = 100;
// int k = 10;
// LinkedListNode[] nodes = new LinkedListNode[list_length];
// for (int i = 0; i < list_length; i++) {
// nodes[i] = new LinkedListNode(i, null, i > 0 ? nodes[i - 1] : null);
// }
/*int nToLast = 4;
System.out.println( myLL.nthToLastR3( myLL.head, nToLast ).data );
int test = myLL.nthToLastR1( myLL.head, nToLast );*/
/* question 2-1 */
/* remove the duplicates from an unsorted linked list */
/*myLL.deleteDupsC( myLL.head);
myLL.display();
System.out.println();*/
/* find the node with it's int value */
/*
int getNode = 12;
System.out.println( myLL.getNode(getNode).data );
*/
/* question 2-3 */
/* write an algorithm to delete a node to middle of a singly linked list given only access to that node */
/*int deleteNode = 12;
myLL.deleteNode( myLL.getNode(deleteNode) );
myLL.display();
System.out.println();*/
/* question 2-4 */
/*
System.out.println("the length of the linked list = "+ myLL2.getLength( ) );
myLL.addLists(myLL1, myLL2 );
*/
/* question 2-5 */
/* find the head of the circular linked list */
/*myLL.createLoop( 15 );
myLL.display();
System.out.println();
if ( myLL.findBeginning( myLL.head ) == null ){
System.out.println("No cycle");
}
else
System.out.println( "head of the loop is = "+ myLL.findBeginning( myLL.head ).data );*/
}
}
最佳答案
我发现 displayInDetails()
中的代码存在短路或 ||
:
if ( current.previous != null || current != null )
看,如果 current != null
仍然 current.previous
可以是 NULL
。因此
current.previous.data
会给你NullPointerException
。
因此,不要使用或,而是尝试和 &&
,如下所示:
if (current != null && current.previous != null)
关于java - Java中的LinkedList数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237127/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!