切换链表中的两个节点

时间:2016-03-03 16:39:01

标签: c++ list object linked-list

我对编程很新,我有这个任务,目标是使用这些函数打印出0123456789然后9876543210

thead

所以如果doswap为true,它应该通过我的链表并交换元素,如果它的值小于后面的那个,当我运行程序没有任何事情我的列表不会打印到屏幕

3 个答案:

答案 0 :(得分:2)

如果b是[{1}}和[{1}}的后继者,a的后继者,则必须a作为prev的继承者和b作为prev的继任者,以交换ab

a

要为列表交换连续元素,必须先处理列表的前两个元素。所以列表的其余部分一步一步。如果到达最后一个列表元素的前置者,则终止。

b

请注意,void List::swap( ListElement * prev, ListElement * a, ListElement * b) { a->next = b->next; // put successor of b in place of succesor of a b->next = a; // put a in place of successor of b prev->next = b; // put b in place of succesor of prev } 是一项任务。循环bool List::SortSwap() { if ( head == nullptr || head->next == nullptr ) return false; bool anySwapped = false; // hadle head of list and its successor if ( head->value < head->next->value ) { ListElement *temp = head; head = head->next; // successor of head becomes new head temp->next = head->next; // successor of old head becomes successor of new head head->next = temp; // new head becomes succesor of old head anySwapped = true; } // continue until predecessor of tail is found ListElement *prev = head; while ( prev->next != nullptr && prev->next->next != nullptr ) { ListElement *a = prev->next; ListElement *b = a->next; if ( a->value < b->value ) { swap( prev, a, b ); anySwapped = true; } prev = prev->next; // step one forward } return anySwapped; } 是无限的。

答案 1 :(得分:1)

假设在交换之前这是当前节点的排列方式:

prev --> a --> b

另外,假设这是交换后节点应该是这样的:

prev --> b --> a

如果以上是交换应该改变的,那么代码 在你的交换函数中需要保存什么节点&#34; b&#34;有下一个 指针:

void List::swap(ListElement * prev, ListElement * a, ListElement * b)
{
     ListElement * temp = b->next;
     prev->next = b;
     b->next = a;
     a->next = temp;
}

答案 2 :(得分:0)

所以你要做的是颠倒列表 我做过类似的事。 。

{{1}}