LeetCode Reorder List

本文介绍了一种链表重组算法,该算法将给定的单链表按特定模式重新排列,而不改变节点值。通过中间断开形成两个链表,反转后半部分链表并将其与前半部分交错合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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}.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode *head) {
    	if(head == NULL || head->next == NULL)
    		return;
    	ListNode *slow = head, *fast = head, *pre = head;
    	将列表从中间断开,形成两个链表head和slow 
		while(fast != NULL && fast->next != NULL) {
			fast = fast->next->next;
			pre = slow;
			slow = slow->next;	
		}
		pre->next = NULL;
		slow = reverseList(slow);
		mergeList(head, slow);		
    }
private:
	//将后部分链表反序 
	ListNode *reverseList(ListNode *head) {
		ListNode *cur = head;
		ListNode *pre = NULL;
		ListNode *post = cur->next;
		while(cur != NULL) {
			//记下下一个指针 
			post = cur->next;
			cur->next = pre;
			pre = cur;
			cur = post;
		}
		return pre;			
	}
	void mergeList(ListNode *head, ListNode *slow) {
		ListNode *tmp = head;
		ListNode *pre_tmp = head;
		ListNode *post_slow = slow->next;
		while(tmp != NULL) {
			post_slow = slow->next;
			slow->next = tmp->next; 
			tmp->next = slow;
			pre_tmp = tmp->next;
			tmp = tmp->next->next;
			slow = post_slow;
		} 
		if(slow != NULL)
			pre_tmp->next = slow; 
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值