2012-05-17 172 views
-2

在不使用遞歸的情況下反轉鏈接列表中的問題。反向鏈接列表

我用這個方法,但是當我嘗試和運行此回了家,我不能打印鏈表的反轉,即使功能看起來好它接着打印方法一樣鏈表它早些時候做過。

有人能幫我理解這裏有什麼問題嗎?

class link { 
    int data; 
    public link nextlink; 

    link(int d1) { 
     data = d1; 
    } 
} 

class List{ 

    link head; 
    link revhead; 

    List(){ 
     head = null; 
    } 

    boolean isEmpty(link head) { 
     return head==null; 
    } 

    void insert(int d1) { 
     link templink = new link(d1); 
     templink.nextlink = head; 
     head = templink; 
    } 

    void printlist(){ 
     link head1 = head; 
     while(!isEmpty(head1)) { 
      System.out.print(head1.data + " "); 
      head1 = head1.nextlink; 
     } 
     System.out.println(); 
    } 

    void reverse() { 
     link previous=null,temp=null; 
     while(isEmpty(head)) { 
      temp = head.nextlink; 
      head.nextlink = previous; 
      previous = head; 
      head = temp; 
     } 
    } 

} 

public class LinkedList { 

    public static void main(String[] args) { 

     List list1 = new List(); 

     list1.insert(10); 
     list1.insert(20); 
     list1.insert(30); 
     list1.insert(40); 
     list1.insert(50); 
     list1.printlist(); 
     list1.reverse(); 
     list1.printlist(); 
    } 
} 
+0

這是功課? – eabraham

+0

當你運行它會發生什麼?當你使用調試器完成代​​碼時,你看到了什麼?它是否在0項長的鏈表上工作? 1件? 2項?如果你使它工作3,它將適用於任何數字...... –

+0

這段代碼在前面的列表中增加了新的條目,所以如果你運行你的打印列表功能,你應該按照與你相反的順序寫出條目添加它們。這不是你想要完成的嗎?也許你需要澄清這個問題。 – Jay

回答

4

你的代碼有兩個問題。一:你檢查isEmpty(頭),你應該檢查!isEmpty(頭)。其次:當你解決第一個問題時,當循環終止時,'head'變爲null。

正確的代碼修復了以上兩個問題:

void reverse() { 
    link previous = null, temp = null; 
    while (!isEmpty(head)) { 
     temp = head.nextlink; 
     head.nextlink = previous; 
     previous = head; 
     if (temp == null) { 
      break; 
     } 
     head = temp; 
    } 

} 
+0

謝謝,想通了,但因爲我是新的,不能在8小時前貼上答案:(很好,你很快就發現了,我花了很多時間來發現錯誤,謝謝! – netsameer

+0

現在完成了,我我想知道,如何反轉K元素,給定值爲K. – netsameer

+0

你是指逆轉第一個K元素?如果是這樣,你想在第一個K元素之後留下其他元素,因爲它們是? –

0

檢查條件: 一段時間(的isEmpty(頭))

你忘了加上 「!」你的意思雖然不是空的......

+0

是的,我想通了,還有一個問題,謝謝很多傢伙! – netsameer

0

考慮遞歸方法在打印鏈接時的作用。實際上它並沒有做任何事情(即將每個調用放在堆棧上,然後當達到基本情況時,它會從堆棧中彈出元素)。

你有什麼非堆棧結構可用於存儲列表的反向,然後讓你打印出來?

+0

如果你看看上面的修正,可以在不使用遞歸的情況下完成。 – netsameer

+0

我很清楚這一點。我的答案並不提供代碼,而是鼓勵OP思考他們想要如何解決他們的解決方案 - 在談論概念時代碼不是必需的。 – Makoto

+0

然後我有一個問題給你,什麼是更好的方法,我的小經驗告訴我,如果有迭代解決方案,應該避免使用堆棧。你對此有何評論? – netsameer

0

更正後的代碼逆轉鏈表沒有遞歸。

class Link { 

    int data; 
    public Link nextLink; 

    Link(int d1) { 
     data = d1; 
    } 
} 

class List { 

    Link head; 
    Link revhead; 

    List() { 
     head = null; 
    } 

    boolean isEmpty(Link head) { 
     return head == null; 
    } 

    void insert(int d1) { 
     Link tempLink = new Link(d1); 
     tempLink.nextLink = head; 
     head = tempLink; 
    } 

    void printlist() { 
     Link head1 = head; 
     while (!isEmpty(head1)) { 
      System.out.print(head1.data + " "); 
      head1 = head1.nextLink; 
     } 
     System.out.println(); 
    } 

    void reverse() { 
     Link previous = null, temp = null; 
     while (!isEmpty(head)) { 
      temp = head.nextLink; 
      head.nextLink = previous; 
      previous = head; 
      head = temp; 
     } 

     head = previous; 
    } 
} 

public class Main { 

    public static void main(String[] args) { 

     List list1 = new List(); 

     list1.insert(10); 
     list1.insert(20); 
     list1.insert(30); 
     list1.insert(40); 
     list1.insert(50); 
     list1.printlist(); 
     list1.reverse(); 
     list1.printlist(); 
    } 
} 
-1
class Node { 
    Node next; 
    int value; 

    public Node() { 
    } 

    public Node(Node next, int value) { 
     super(); 
     this.next = next; 
     this.value = value; 
    } 

    public Node getNext() { 
     return next; 
    } 

    public void setNext(Node next) { 
     this.next = next; 
    } 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 

} 

public class Linkedlist { 
    private Node head = null; 

    public Linkedlist(Node head) { 
     this.head = head; 
    } 

    public void iterate() { 
     Node current = head; 
     while (current != null) { 
      System.out.println(current.getValue()); 
      current = current.getNext(); 
     } 
    } 

    public void reverse() { 
     Node current = head; 
     Node prev = null; 
     while (current != null) { 
      Node temp = current.next; 
      current.next = prev; 
      prev = current; 
      current = temp; 
     } 
     head = prev; 
    } 

    public static void main(String[] args) { 
     Node n = new Node(null, 10); 
     Node n1 = new Node(n, 20); 
     Node n2 = new Node(n1, 30); 
     Node n3 = new Node(n2, 40); 
     Node n4 = new Node(n3, 50); 
     Node n5 = new Node(n4, 60); 
     Linkedlist linkedlist = new Linkedlist(n5); 
     linkedlist.iterate(); 
     linkedlist.reverse(); 
     System.out.println("------------------REVERSED---------------------"); 
     linkedlist.iterate(); 

    } 
} 
+0

什麼時候這不起作用 – Pramod