经典算法问题:链表分段反转
题目要求:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现
思路:这个题和反转字符串部分一个思路。
若有一条链表1→2→3→4→5→6,k=2。
第一步:将链表分为两段 x=1->2,y=3→4→5→6,
第二步:分别将x y反转 得:x=2->1 , y=6->5->4->3
第三步:链接x,y;
c++11版:
1 int main() 2 { 3 list<int>a{ 1, 2, 3, 4, 5, 6 }; 4 list<int>b; 5 auto p = a.begin(); 6 while (*p != 3) 7 { 8 b.push_front(*p); 9 p++; 10 } 11 b.push_front(*p); 12 while (p != a.end()) 13 b.insert(b.end(),*p++); 14 for (auto &u : b) 15 { 16 cout <<u << endl; 17 } 18 19 getchar(); 20 }
C版:
1 typedef struct l{ 2 int data; 3 l* next; 4 }l; 5 l* reverse(l* head,int num) 6 { 7 if (head == NULL || num <= 0) return NULL; 8 l* p = head;// p 用来遍历原链表 1->2->3->4->5->6->NULL 9 l* node = NULL; // node 指向的链表 :k->...->1 10 l* node2 = NULL;// node2 指向剩下的 11 l* flag = NULL;//指向 node 最后的结点,在链接两个链表时用 12 l*q = NULL;//指向新的结点 13 while (p->data != num) 14 { 15 q = (l*)malloc(sizeof(l)); 16 q->data = p->data; 17 if (node == NULL) 18 { 19 q->next = NULL; 20 node = q; 21 flag = node; 22 p=p->next; 23 continue; 24 } 25 q->next = node; 26 node = q; 27 p = p->next; 28 } 29 //这时 p 指向 k ,把 k 的结点插进 node 30 q = (l*)malloc(sizeof(l)); 31 q->data = p->data; 32 q->next = node; 33 node = q; 34 p = p->next; 35 //遍历 k 结点后面的结点 36 while (p != NULL) 37 { 38 q = (l*)malloc(sizeof(l)); 39 q->data = p->data; 40 if (node2 == NULL) 41 { 42 q->next = node2; 43 node2 = q; 44 p = p->next; 45 continue; 46 } 47 q->next = node2; 48 node2 = q; 49 p = p->next; 50 } 51 flag->next = node2;//合并 52 return node; 53 } 54 55 int main() 56 { 57 int a[6] = { 1, 2, 3, 4, 5, 6 }; 58 l* link[6]; 59 60 //新建链表 1->2->3->4->5->6->NULL 61 for (int i = 0; i < 6; i++) 62 { 63 link[i] = (l*)malloc(sizeof(l*)); 64 link[i]->data = a[i]; 65 link[i]->next = NULL; 66 } 67 for (int i = 0; i < 5; i++) 68 { 69 link[i]->next = link[i + 1]; 70 } 71 72 //调用函数完成反转 73 l* tmp = reverse(link[0], 2); 74 75 //输出 76 for (; tmp != NULL; tmp = tmp->next){ 77 cout << tmp->data << " "; 78 } 79 getchar(); 80 }
嗯嗯 ,就这样把。