把一个带头链表进行分割的两种算法
把一个带头链表进行分割
L = {a1, b1, a2, b2, a3, b3 ... an, bn}
L1 = {a1, a2, a3 ... an} 使用尾插法进行修改,得到的链表是正序数的
L2 = {bn ... b3, b2, b1} 使用头插法进行修改,得到的链表是倒序数的
1 #include <iostream> 2 3 using std::string; 4 using std::string; 5 6 typedef struct Lnode 7 { 8 string name; 9 struct Lnode * next; 10 11 }LinkNode; 12 13 // 把一个带头链表进行分割 14 // L = {a1, b1, a2, b2, a3, b3 ... an, bn} 15 // L1 = {a1, a2, a3 ... an} 使用尾插法进行修改,得到的链表是正序数的 16 // L2 = {bn ... b3, b2, b1} 使用头插法进行修改,得到的链表是倒序数的 17 18 void spiltList_noChange(LinkNode * link, LinkNode *&L1, LinkNode *& L2) // 假设这个表的A、B元素相同, 不更改原链表 19 { 20 L1 = new LinkNode; 21 L2 = new LinkNode; 22 L2->next = nullptr; 23 24 LinkNode * rear_L1; // 表尾指针 25 L1 = link; 26 rear_L1 = L1; 27 28 LinkNode *pre; //用来更新的元素 29 LinkNode * temp1, *temp2; //用来存储取出来的元素 30 pre = link->next; //指向第一个元素 31 while (pre != nullptr) 32 { 33 temp1 = new LinkNode; 34 temp2 = new LinkNode; 35 36 temp1->name = pre->name; 37 rear_L1->next = temp1; 38 rear_L1 = temp1; 39 40 pre = pre->next; //更新头结点 41 42 temp2->name = pre->name; 43 temp2->next = L2->next; 44 L2->next = temp2; 45 pre = pre->next; 46 } 47 rear_L1->next = nullptr; // 表尾指针为空 48 } 49 50 void splitList_change(LinkNode * &link, LinkNode * &L1, LinkNode *&L2) //假设原链表的A、B元素相同,改变原链表 51 { 52 L1 = link; //L1直接指向原链表的表头,使用尾插法 53 L2 = new LinkNode; //创建一个表头结点,使用头插法 54 L2->next = nullptr; 55 56 LinkNode * rear_L1;// 表尾指针 57 rear_L1 = L1; 58 59 LinkNode * temp; 60 LinkNode *pre = link->next; // 保存元素指针 61 62 while (pre != nullptr) 63 { 64 rear_L1->next = pre; 65 rear_L1 = rear_L1->next; 66 pre = pre->next; 67 68 temp = pre->next; //暂存首节点 69 70 pre->next = L2->next; 71 L2->next = pre; 72 pre = temp; // 还原 首节点 73 } 74 rear_L1->next = nullptr; // 表尾指针置 nullptr 75 }
#仅供学习参考,大神请无视我#
posted on 2017-12-15 16:54 weibin_caffe 阅读(262) 评论(0) 收藏 举报
浙公网安备 33010602011771号