循环链表的插入操作
1. 参考文章http://www.leetcode.com/2011/08/insert-into-a-cyclic-sorted-list.html
2. 测试代码
View Code
1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 int data; 9 Node* next; 10 Node(int x) 11 { 12 this->data=x; 13 this->next=NULL; 14 } 15 }; 16 17 void insert(Node *& aNode, int x) { 18 if (!aNode) { 19 aNode = new Node(x); 20 aNode->next = aNode; 21 return; 22 } 23 24 Node *p = aNode; 25 Node *prev = NULL; 26 do { 27 prev = p; 28 p = p->next; 29 //插入在两值之间 30 if (x <= p->data && x >= prev->data) break; // For case 1) 31 //如果插入的值是最大值或最小值 32 if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // For case 2) 33 } while (p != aNode); // 如果只有一个节点或者所有值都相同,就需要这个条件退出循环 34 35 Node *newNode = new Node(x); 36 newNode->next = p; 37 prev->next = newNode; 38 //如果插入的是最小值,需要更改头指针 39 if ((prev->data > p->data) && (x < p->data )) 40 { 41 aNode=prev->next; 42 } 43 } 44 45 int main() 46 { 47 Node* pHead=NULL; 48 enum {aLength=8}; 49 int a[aLength]={4,1,2,5,3,7,0,9}; 50 for (int i=0;i<aLength;i++) 51 { 52 insert(pHead,a[i]); 53 } 54 assert(pHead); 55 Node* pTmp=pHead; 56 do 57 { 58 cout<<pTmp->data<<" "; 59 pTmp=pTmp->next; 60 } while (pTmp!=pHead); 61 cout<<endl; 62 }
3. 注意事项:
1. 考虑到每一种情况。并可以把几种情况合并成一种情况。
2. 这里使用do while循环比较方便。
3. 简洁的代码书写方式。