#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
void reorderList(ListNode *head) {
ListNode * p0 = head;
ListNode * p = head;
if( !(p != NULL && p->next != NULL && p->next->next != NULL)){
//少于等于两个节点
return;
}
//链表分两半
while( p->next!= NULL && p->next->next != NULL){
p0 = p0->next;
p = p->next->next;
}
//后半反向
p = p0->next;
p0->next = NULL;
//尾变首
ListNode *t = p;
p = p->next;
t->next = NULL;//特别注意
while(p != NULL){
ListNode *tt = p->next;
p->next = t;
t = p;
p = tt;
}
p = t;
//两部分合并。
ListNode *tt;
p0 = head;
while( p0 != NULL && p!= NULL){
t = p0->next;
tt = p->next;
p0->next = p;
p->next = t;
p0 = t;
p = tt;
}
}
};
int main()
{
Solution ss;
ListNode *head = new ListNode(1);
ListNode *p = head;
int n = 2;
while( n != 6)
{
p->next = new ListNode(n++);
p = p->next;
}
ss.reorderList(head);
return 0;
}
leetcode——链表reorder
最新推荐文章于 2023-03-06 21:58:49 发布