改变链表顺序

来源:互联网 发布:4g网络哪个运营商好 编辑:程序博客网 时间:2024/06/07 07:55

出自于CareerCup,原题如下:

Suppose that we have a sorted singly linked list with integer values. For example:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
We want to change the pointers of this linked list so that it becomes:
7->1->6->2->5->3->4


我的思路是先把链表分为前后两部分,再把后一部分顺序颠倒,然后再把两部分交替着连成新的链表,这样空间复杂度和时间复杂度都可以接受。

长时间不用链表了写得有些乱,中途还写错了导致死循环或内存报错好几次|||

代码如下:


#ifndef NODEH#define NODEHclass node{public:int value;node *next;};#endif

#include "node.h"#include <iostream>using namespace std;int main(){node *head = new node();node *end = new node();node *current = head;int num;while(cin>>num){current->next = new node;current = current->next;current->value=num;}current->next=end;node *headr = head;node *endr = new node();node *headt = new node();node *endt = end;current = head;node* half = head;while((current->next!=end)&&(current!=end)){current=current->next->next;half=half->next;}headt->next = half->next;half->next = endr;node* former = headt;current = headt->next;while(current->next!=endt){node *temp = current->next;current->next = former;former=current;current = temp;}current->next=former;endt->next=current;node *current2 = endt->next;current = headr->next;node *nextt;node *nextr;while(current2->next!=headt){nextt=current2->next;nextr=current->next;current2->next=current;current->next=nextt;current=nextr;current2=nextt;}current2->next=current;current=endt;while(current->next!=endr){current = current->next;cout<<current->value<<" ";}cout<<endl;return 0;}


原创粉丝点击