如何遍历前面两个节点的链接列表?

时间:2013-02-27 19:38:34

标签: java c linked-list

我有一个链接列表,我希望能够提前看两个节点。我需要检查前两个节点是否有整数,如果它们有,并且第三个节点说ADD,那么我需要将该信息压缩到一个节点并释放其他两个节点。

我对我的while循环中的内容感到困惑。我检查第三个节点是否指向null,但不知怎的,它没有给我正确的输出。我不知道我是否正确处理我的node.next。其中一些是伪代码。

while(node1.next.next.next != NULL){
    if((node1.data.isInteger() && (node2.data.isInteger()){
        if(node3.data.equals('add')){
            node1.data = node1.data + node2.data;
        } else {
            //ERROR
        }
        garbage_ptr1 = node2;
        garbage_ptr2 = node3;
        node1.next = node3.next;
        free(garbage_ptr1);
        free(garbage_ptr2);
        node2.next = node1.next.next;
        node3.next = node2.next.next;
   } else {
        node1.next = node1.next.next;
        node2.next = node1.next.next;
        node3.next = node2.next.next;
   }

1 个答案:

答案 0 :(得分:0)

我发现更简单的方法是维护一个小数组,作为列表中的窗口,并在数组上查找匹配项。如果将空检查移动到实用程序方法中,代码也会变得更加简洁和简单。通过执行这些操作,列表上的循环只需要检查要终止的窗口的最后一个元素。

Java中的草图:

/* small utility methods to avoid null checks everywhere */
public static Node getNext(Node n) { return n != null ? n.next : null; }

public static boolean isInteger(Node n) {
  return (n != null) && (n.data != null) && (n.data instanceof Integer);
}
public static boolean isAdd(Node n) { 
  return (n != null) && (n.data != null) && n.data.equals("add");
}

/* checks for a match in the 3-node window */
public boolean isMatch(Node[] w) {
  return isInteger(w[0]) && isInteger(w[1]) && isAdd(w[2]);
}

/* Loads the 3-node window with 'n' and the next two nodes on the list */
public void loadWindow(Node[] w, Node n) { 
  w[0] = n; w[1] = getNext(w[0]); w[2] = getNext(w[1]);
}

/* shifts the window down by one node */
public void shiftWindow(Node[] w) { loadWindow(w, w[1]); }

...
Node[] window = new Node[3];
loadWindow( window, node1 );
while (window[2] != null) {
  if (isMatch(window)) { 
    window[0].data = stack[0].data + stack[1].data;
    window[0].next = window[2].next;
    loadWindow(window, window[0]);  // reload the stack after eliminating two nodes
  } else {
    shiftWindow( window );
  }
}