经典算法问题:链表分段反转

题目要求:链表翻转。给出一个链表和一个数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 < 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 }

嗯嗯 ,就这样把。

 

转载请注明:http://www.cnblogs.com/firstcxj/

 

转载于:https://www.cnblogs.com/firstcxj/p/4566318.html

你可能感兴趣的:(经典算法问题:链表分段反转)