尝试在给定链接列表中给定节点的指针的情况下反转链接列表元素。 例如,我将获得指向第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;
}
此代码编译但不能正确执行反向节点,我不确定原因。
答案 0 :(得分:0)
我没有尝试过对此进行编码,但在算法上这应该非常快;
1)首先从子列表的开始和结束位置之间的所有节点交换prev
和next
的值。这将反转其间所有节点的顺序。只留下边缘节点。
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个节点。