问题描述
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
可使用以下代码,完成其中的reorderList函数,其中形参head指向无头结点单链表。
#include<iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
void reorderList(ListNode* head)
{
//填充本函数完成功能
}
};
ListNode *createByTail()
{
ListNode *head;
ListNode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=NULL;
while(n<len && cin>>num)
{
p1=new ListNode(num);
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
void displayLink(ListNode *head)
{
ListNode *p;
p=head;
cout<<"head-->";
while(p!= NULL)
{
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
int main()
{
ListNode* head = createByTail();
Solution().reorderList(head);
displayLink(head);
return 0;
}
输入说明
首先输入链表长度len,然后输入len个整数,以空格分隔。
输出说明
代码思路
找到链表的中间位置,把链表截断为两部分,后半段段存放在栈中,依次插入第一个链表中
class Solution
{
public:
void reorderList(ListNode* head)
{
//找到中间位置,把链表截断为两部分,第二段存放在栈中,依次插入第一个链表中
ListNode *l1=head,*p=head,*l2,*q;
//求表长
int len=0;
while(p){
len++;
p=p->next;
}
if(len<=2) return;
int len1=len/2+len%2;
p=head;
for(int i=0;i<len1-1;i++){
p=p->next;
}
l2=p->next;
p->next=nullptr;//截断l1
stack<ListNode*>stk;
q=l2;
while(q){
stk.push(q);
q=q->next;
}
ListNode *tmp;
while(!stk.empty()){
tmp=stk.top();
stk.pop();
tmp->next=l1->next;
l1->next=tmp;
l1=tmp->next;
}
}
};