143. Reorder List

/**算法思想是:先將鏈表拆成兩部分,然後逆轉後面的一部分,最後合併兩個部分得到最終的結果鏈表
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
void reverseList(ListNode *&head)//鏈表的逆轉
{
	if (head == NULL)
		return ;
	ListNode*p = NULL,*s=NULL;
	while (head ->next!= NULL)
	{
		s = head->next;
		head->next = p;
		p = head;
		head = s;
	}
	head->next = p;
}
    void reorderList(ListNode* head)
    {
       if (head == NULL || head->next == NULL || head->next->next == NULL)
		return;
	ListNode *p = head, *q = head;
	//拆鏈表
	while (p && q && q->next && q->next->next)
	{
		p = p->next;
		q = q->next->next;
	}
	ListNode*s = p->next,*m=NULL;//第二部分的首結點;
	p->next = NULL;//截斷第一部分;
	reverseList(s);//鏈表逆轉
	//合併鏈表
	p = head;
	while (p != NULL&&s != NULL)
	{
		m = p->next;
		q = s->next;
		p->next = s;
		s->next = m;
		p = m;
		s = q;
	}
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章