给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
1查找链表的中间,分为偶数和奇数两种
2找到中间端之后,断链,分为前半段和后半段
3对链表的后半段入栈操作stack ”behalf“ push
4合并两个链表head,behalf
代码如下,有些乱:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reorderList(struct ListNode* head){
struct ListNode * behalf=NULL;
int hcount=1;
struct ListNode *nextp=NULL;
struct ListNode *sp=NULL;
struct ListNode *sp1=NULL;
struct ListNode *fastp=NULL;
int listlen=0;
nextp=head;
while(nextp!=NULL)
{
listlen++;
nextp=nextp->next;
}
nextp=fastp=head;
while(fastp!=NULL)
{
if(hcount<listlen/2)
{
nextp=nextp->next;
fastp=nextp->next;
}
if(hcount==listlen/2&&listlen%2)//奇数个node找中间值
{
nextp=nextp->next;
fastp=nextp->next;
}
if(hcount==listlen/2&&(listlen%2==0))//偶数个node找中间值,并入栈
{
sp=fastp->next;
fastp->next=behalf;
behalf=fastp;
if(nextp)
nextp->next=NULL;
fastp=sp;
}
if(hcount>listlen/2)//链表节点入栈
{
sp=fastp->next;
fastp->next=behalf;
behalf=fastp;
if(nextp)
nextp->next=NULL;
fastp=sp;
}
hcount++;
}
nextp=head;
fastp=behalf;
while(nextp&&fastp) //合并
{
sp=nextp->next;
sp1=fastp->next;
nextp->next=fastp;
fastp->next=sp;
nextp=sp;
fastp=sp1;
}
}
战绩上去了点。。。啊。