簡體   English   中英

反轉給定節點之間的雙鏈表

[英]Reverse a Doubly Linked List between the given nodes

試圖反轉給定鏈表中給定節點的指針的鏈表元素。 例如,我將獲得指向鏈表中第4個節點的指針和第7個節點的指針,並且必須反轉這些節點之間的節點。 這是一些不起作用的相關代碼:

template <class T>
void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint ){

  if (startPoint == NULL)  
    return;

  if (startPoint->prev != NULL)
    startPoint->prev->next = endPoint;

  if (endPoint->next != NULL)
    endPoint->next->prev = startPoint;

  ListNode * curr = startPoint;
  ListNode * temp = startPoint;

  while(curr != endPoint)
  {
    temp = curr->next;
    curr->next = curr->prev;
    curr->prev = temp;
    curr = temp;
  }

  temp = endPoint->next;
  endPoint->next = endPoint->prev;
  endPoint->prev = temp; 

  temp = startPoint->next;
  startPoint->next = endPoint->next;
  endPoint->prev = startPoint->prev;

  temp = startPoint;
  startPoint = endPoint;
  endPoint = temp;

} 

這段代碼可以編譯,但不能正確執行反向節點,我不確定為什么。

我沒有嘗試對此進行編碼,但是從算法上來說,這應該非常快。

1)首先從子列表的開始和結束位置之間的所有節點交換prevnext的值。 這將反轉其間所有節點的順序。 只留下邊緣節點。

2)在所有位置交換next和prev之后,還將原始起始節點的更新next與原始結束節點的更新prev交換。 現在,這些節點將指向序列的正確其余部分。

3)為了管理,還更新序列外的節點以正確指向。

一個示例 (節點顯示為“ NODE(PREV,NEXT)”)

A(0,B) - B(A,C) - C(B,D) - D(C,E) - E(D,F) - F(E,-)

反轉節點1-4(B-E)

第一步:

A(0,B) - B(C,A) - C(D,B) - D(E,C) - E(F,D) - F(E,-)

第二名

A(0,B) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(E,-)

第三名

A(0,E) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(B,-)

現在使訂單可視化:

A(0,E) - E(A,D) - D(E,C) - C(D,B) - B(C,F) - F(B,-)

在那里,顛倒了中間的4個節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM