• leetCode(6):Reorder list 分类: leetCode 2015-06-17 15:42 122人阅读 评论(0) 收藏


    Given a singly linked list LL0L1→…→Ln-1Ln,
    reorder it to: L0LnL1Ln-1L2Ln-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}.

    常规版本:遍历链表的方式,事实证明,遍历永远不是最好的!

    void reorderList(ListNode* head)
    {//递归、循环效果应该差不多
    	ListNode* p=head;
    	if(head==NULL || head->next==NULL)
    		return;
    	ListNode* currentNode=p;
    	ListNode* nextNode=p->next;
    	ListNode* newNextNode=nextNode;
    	
    	while(nextNode && nextNode->next)
    	{
    		ListNode* preNewNextNode=currentNode;
    		ListNode* prePreNewNextNode=currentNode;
    		while(newNextNode->next)
    		{
    			preNewNextNode=preNewNextNode->next;
    			newNextNode=newNextNode->next;
    		}
    		prePreNewNextNode->next=NULL;
    		preNewNextNode->next=NULL;
    		
    		currentNode->next=newNextNode;
    		newNextNode->next=nextNode;
    		currentNode=nextNode;
    		nextNode=currentNode->next;		
    		newNextNode=nextNode;
    	}
    }

    反转子链表版本:用两个指针,一快一慢遍历整个链表,直到较快的链表到达末尾,慢指针刚好到达中点,然后断开链表。把后段链表反转,再逐个插入。


    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseList(ListNode* head)
        {	
        	if(!head)
        		return head;
        	ListNode* p=head;
        	ListNode* q=p->next;	
        	if(!q)
        		return head;
        	ListNode* k=q->next;
        	p->next=NULL;
        	while(k)
        	{
        		q->next=p;
        		p=q;
        		q=k;
        		k=k->next;
        	}	
        	q->next=p;
        	return q;//返回头结点
        }
        void reorderList(ListNode* head) {
        	if(head==NULL || head->next==NULL)
        		return;
        	ListNode* p=head;
        	ListNode* fast=p;
        	ListNode* slow=p;
        	while(fast && fast->next)
        	{
        		fast=fast->next->next;
        		slow=slow->next;
        	}
        	ListNode* subHead=slow->next;
        	slow->next=NULL;
        	subHead=reverseList(subHead);
        	ListNode* p2=subHead;
        	while(p2!=NULL)
        	{
        		ListNode* tmp1=p->next;
        		ListNode* tmp2=p2->next;
        		p->next=p2;
        		p2->next=tmp1;
        		p2=tmp2;
        		p=tmp1;	
        	}
        }
    };



  • 相关阅读:
    java大数取余
    hdu--5351--MZL's Border
    NYOJ--水池数目
    NYOJ--32--SEARCH--组合数
    NYOJ--20--搜索(dfs)--吝啬的国度
    hdu--4148--Length of S(n)
    hdu--2098--分拆素数和
    hdu--1873--看病要排队
    hdu--1870--愚人节的礼物
    hdu--1237--简单计算器
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687111.html
Copyright © 2020-2023  润新知