2017-08-31 88 views
1

所以ListNodes真的一直困惑着我,我一直在試着理解代碼片斷,看看它們是如何工作的,但下面的反向函數我只是無法理解,特別是while循環可以有人請給我解釋一下。反向鏈接列表(幫助)

// Definition for singly-linked list: 
// class ListNode<T> { 
// ListNode(T x) { 
//  value = x; 
// } 
// T value; 
// ListNode<T> next; 
// } 
// 

ListNode<Integer> reverse(ListNode<Integer> l) { 
    if(l==null||l.next==null) 
     return l; 

    ListNode<Integer> p1 = l; 
    ListNode<Integer> p2 = p1.next; 

    l.next = null; 

    while(p1!=null&& p2!=null){ 
     ListNode<Integer> t = p2.next; 
     p2.next = p1; 
     p1 = p2; 
     p2 = t; 
    } 

    return p1; 

} 
+1

這是什麼語言? – OmegaNalphA

+0

@OmegaNalphA它是java – csmajor97

回答

0

本質上,它們使臨時變量t保持所述額外值P2指向,切換指針P1和P2之間,然後使新的P2點到該臨時變量。由於他們已經將p2.next點聲明爲p1,因此即使p2將其替換爲下一行,也不會刪除它。

雖然它的寫法有些奇怪,但通常我已經看到了指針在哪裏亂碼,而不是它在這裏顯示的方式。

+0

我不明白的是臨時變量t能夠如何保持p2.next的初始值。例如,當ListNode p1 = l,然後我們使l.next = null時,這也會導致p1.next = null。因此,如果我們改變p2.next = p1,這是不是意味着ListNode t = p1也? – csmajor97

+0

我敢肯定,在這種情況下,它正在複製值,因爲它們並不真正處理指針,所以它是位於p2.next中的對象的副本。你可以做的一件事情是在每次執行時(例如,在每個增加的節點中插入一個字符串)輸出t和p2.next的值,並查看發生了什麼/如何改變 – OmegaNalphA