Given asingly linked list L:(L0,L1,L2,...,Ln-1,Ln).Write a program to reorder it so that it becomes(L0,Ln,L1,Ln-1,L2,Ln-2,...)
struct Node
{
int val_;
Node* next;
};
Notes:
1.Space Complexity should be O(1)
2.Only the ".next" field of a node is modifiable.
新方法:[传送门](2013.11.16 update)
1 #include"stdafx.h" 2 #include<iostream> 3 using namespace std; 4 5 struct Node 6 { 7 int val_; 8 Node* next; 9 }; 10 11 Node *CreateListNode(int key) 12 { 13 Node *ListNode=new Node; 14 ListNode->val_=key; 15 ListNode->next=NULL; 16 return ListNode; 17 } 18 19 void ConnectListNodes(Node *ListNode1,Node *ListNode2) 20 { 21 ListNode1->next=ListNode2; 22 } 23 24 void PrintList(Node *ListHead) 25 { 26 Node* p=ListHead; 27 while(p!=NULL) 28 { 29 cout<<p->val_<<" "; 30 p=p->next; 31 } 32 cout<<endl; 33 } 34 35 void ReorderList(Node *ListHead) 36 { 37 Node *i,*j,*p,*q; 38 39 i=ListHead; 40 while(i&&i->next!=NULL) 41 { 42 j=i->next; 43 p=i; 44 q=i->next; 45 while(q->next!=NULL) 46 { 47 p=p->next; 48 q=q->next; 49 } 50 if(q!=j) 51 { 52 i->next=q; 53 q->next=j; 54 p->next=NULL; 55 } 56 else 57 { 58 i->next=q; 59 } 60 i=j; 61 j=j->next; 62 } 63 } 64 65 void DestroyList(Node *ListHead) 66 { 67 ListHead=NULL; 68 } 69 70 void Test(Node* ListHead) 71 { 72 PrintList(ListHead); 73 ReorderList(ListHead); 74 PrintList(ListHead); 75 } 76 // 0->1->2->3->4->5 77 void Test1() 78 { 79 cout<<"Test1 begins."<<endl; 80 Node *ListNode0=CreateListNode(0); 81 Node *ListNode1=CreateListNode(1); 82 Node *ListNode2=CreateListNode(2); 83 Node *ListNode3=CreateListNode(3); 84 Node *ListNode4=CreateListNode(4); 85 Node *ListNode5=CreateListNode(5); 86 ConnectListNodes(ListNode0,ListNode1); 87 ConnectListNodes(ListNode1,ListNode2); 88 ConnectListNodes(ListNode2,ListNode3); 89 ConnectListNodes(ListNode3,ListNode4); 90 ConnectListNodes(ListNode4,ListNode5); 91 92 Test(ListNode0); 93 DestroyList(ListNode0); 94 } 95 // 0->1->2->3->4->5->6 96 void Test2() 97 { 98 cout<<"Test2 begins."<<endl; 99 Node *ListNode0=CreateListNode(0); 100 Node *ListNode1=CreateListNode(1); 101 Node *ListNode2=CreateListNode(2); 102 Node *ListNode3=CreateListNode(3); 103 Node *ListNode4=CreateListNode(4); 104 Node *ListNode5=CreateListNode(5); 105 Node *ListNode6=CreateListNode(6); 106 ConnectListNodes(ListNode0,ListNode1); 107 ConnectListNodes(ListNode1,ListNode2); 108 ConnectListNodes(ListNode2,ListNode3); 109 ConnectListNodes(ListNode3,ListNode4); 110 ConnectListNodes(ListNode4,ListNode5); 111 ConnectListNodes(ListNode5,ListNode6); 112 113 Test(ListNode0); 114 DestroyList(ListNode0); 115 } 116 117 // 只有一个结点 118 void Test3() 119 { 120 cout<<"Test3 begins."<<endl; 121 Node* ListNode0=CreateListNode(0); 122 Test(ListNode0); 123 DestroyList(ListNode0); 124 } 125 126 // 空链表 127 void Test4() 128 { 129 cout<<"Test4 begins."<<endl; 130 Test(NULL); 131 } 132 133 int main() 134 { 135 Test1(); 136 Test2(); 137 Test3(); 138 Test4(); 139 return 0; 140 }
总结:1.离开了VS,自己手写并且能够写对还是很困难。
2.时间复杂度O(n2),应该还可以优化。
欢迎批评指正!