Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
思想:找出中间元素的头指针,将后段链表逆置,然的再合并两链表
/**
* 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) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(NULL == head) return;
if(NULL == head->next) return;
ListNode *nhead = NULL, *qptr = NULL, *ptr = NULL, *lastPtr;
ptr = nhead = head;
//找出中间的元素的指针
while(nhead && ptr){
lastPtr = ptr;
ptr = ptr->next;
nhead = nhead->next;
if(nhead) nhead = nhead->next;
}
lastPtr->next = NULL; //将第一段尾指针next赋值为空
//ptr此时为第二段链表的头指针,但要作一次逆置
nhead = NULL;
while(ptr){
qptr = ptr;
ptr = ptr->next;
qptr->next = nhead;
nhead = qptr; //新的头指针
}
//将链表二的元素插入到链表一
while(head && nhead){
qptr = nhead;
ptr = head;
nhead = nhead->next;
head = head->next;
qptr->next = ptr->next;
ptr->next = qptr;
}
}
};