一、题目:

二、输入输出示例:
三、思路:
题目怎么要求,就怎么变换链表结点,但要注意,链表是单向的,一旦改变其中结点的指向,被改变的结点的原指针指向的结点可能会丢失,所以必须要预先记好。所以用到了4个指针,即p1,p2,lastpre,last,p1初始化为表头,p2记录p1的下一个结点,因为p1要指向最后一个结点,改变p1的指针之后就找不到p1原来指向的结点了,同理,lastpre是用来记录最后一个结点的前一个结点的。
四、代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL || head->next->next == NULL){
return;
}
ListNode *p1,*p2,*last,*lastpre;
p1 = last = lastpre = head;
p2 = p1->next;
while(last->next != NULL && last->next->next != NULL){
while(lastpre->next->next != NULL){
lastpre = lastpre->next;
}
last = lastpre->next;
p1->next = last;
last->next = p2;
lastpre->next = NULL;
p1 = p2;
p2 = p2->next;
last = p1;
lastpre = p1;
}
}
};