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}
.
题意:修改链表排列顺序,不改变节点的值,使得新链表的顺序是就链表从前往后和从后往前遍历顺序交叉。
用一个动态数组,存顺序遍历的链表指针,方便重新连接链表next的操作。
之后就按照题意,用i和j分别从头和从尾开始遍历,连接成新的链表,注意分情况讨论最后一个节点。
/** * 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)return ; vector<ListNode*> v; int i,j; ListNode *p=head; while(p) { v.push_back(p); p=p->next; } for(i=0,j=v.size()-1;j>i;--j,++i) { v[j]->next=v[i]->next; v[i]->next=v[j]; } if(j==i)v[i]->next=NULL; else v[j+1]->next=NULL; } }; //// blog.csdn.net/havenoidea