[LeetCode OJ] Reorder List—Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.

 1 /**

 2  * Definition for singly-linked list.

 3  * struct ListNode {

 4  *     int val;

 5  *     ListNode *next;

 6  *     ListNode(int x) : val(x), next(NULL) {}

 7  * };

 8  */

 9 class Solution {

10 public:

11     void reorderList(ListNode *head) {

12         //求链表的总长度len

13         if(head==NULL)

14             return;

15         int len=0;

16         ListNode *p = head; //tail用于指向整个链表的尾节点

17         while(p!=NULL)

18         {

19             p = p->next;

20             len++;

21         }

22         //将链表拆成两半,并将后半部分的链表顺序倒置,如原来链表为L1->L2->L3->L4->L5->L6->L7,现在得到两个链表L1->L2->L3->L4和L7->L6->L5

23         int i=0;

24         ListNode * h1 = head;

25         ListNode * h2 = head ,*pre;

26         while(i<(len+1)/2)

27         {

28             pre = h2;

29             h2 = h2->next;

30             i++;

31         }

32         pre->next = NULL; //h1指向拆分后得到的第一个链表的第一个节点,并将第一个链表的最后一个节点的指针域置为NULL; h2指向拆分后得到的第二个链表的第一个节点,到这一步尚未对第二个链表倒置

33          

34         //对第二个链表进行倒置

35         ListNode * temp;

36         p = h2;

37         if(p!=NULL)

38         {

39 

40             h2 = h2->next;

41             p->next = NULL;

42             while(h2!=NULL)

43             {

44                 temp = h2;

45                 h2 = h2->next;

46                 temp->next = p;

47                 p = temp;

48             }

49         }

50         h2 = p;

51 

52         //由两个链表L1->L2->L3->L4和L7->L6->L5按如下方式得到所求的第三个链表,将第一个链表的第一个节点连接到第三个链表的末端,再将第二个链表的第一个节点连接到第三个链表的末端,以此类推,直到两个链表都为空

53         //得到的第三个链表便是L1->L7->L2->L6->L3->L5->L4

54         ListNode * tail = h1;

55         h1 = h1->next;

56         i = 0;

57         while(h1!=NULL || h2!=NULL)

58         {

59             tail->next = (++i%2)? h2 : h1;

60             tail = tail->next;

61             (i%2) ? (h2 = h2->next) : (h1 = h1->next);

62         }

63         return;  

64     }

65 };

 

你可能感兴趣的:(LeetCode)