2019 重排链表

题目描述:将链表L(a1,a2,a3,...,an-2,an-1,an)重排为L'(a1,an,a2,an-1,a3,an-2,...),要求空间复杂度为O(1)。

算法描述:

一、先找到L的中心节点,设置两个指针p和q。p一次走一步,q一次走两步,当q走到末尾时,

1.当链表长为奇数时,p走到中心节点。

2.当链表长为偶数时,观察可知需要重新插入的节点是中间两个节点的后一个的后面节点,如:123456,此时需要重新插入的节点是5和6,此时p走到中间两个节点的后一个节点。

二、将需要重新插入的后一段节点逆置,即无论是奇数还是偶数都是从p的下一个节点开始逆置。

三、从后一段依次拿出节点插入前一段。

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;//单链表 

void change_list(LinkList L){
	LNode *p,*q,*r,*s;
	p=q=L;
	while(q->next!=NULL){	//找到逆置点的前一个节点 
		p=p->next;
		q=q->next;
		if(q->next!=NULL) q=q->next;	
	}
	q=p->next;
	p->next=NULL;	//后一段逆置后的L的末尾 
	while(q!=NULL){		//后一段用头插法逆置 
		r=q->next;
		q->next=p->next;
		p->next=q;
		q=q->next;
	}
	s=L->next;	//s为前一段起始点 
	q=p->next;
	p->next=NULL;    //重排后的末尾
	while(q!=NULL){		//依次插入 
		r=q->next;
		q->next=s->next;
		s->next=q;
		s=q;
		q=r;
	}
}

 

PTA平台上重排链表问题通常是给定链表各节点的信息,要求对链表进行重排并按特定格式输出结果链表。以下是解决该问题的一般思路和示例代码: #### 思路分析 1. **读取输入信息**:输入通常包含链表的首地址、节点数量以及各节点的地址、数据和下一个节点的地址。需要将这些信息存储起来构建链表。 2. **构建链表**:根据输入信息,将节点按顺序连接成链表。 3. **重排链表**:对链表进行重排,一般是将链表的后半部分节点依次插入到前半部分节点之间。 4. **输出结果**:按要求的格式输出重排后的链表。 #### 示例代码 ```python # 读取输入 head, n = input().split() n = int(n) # 存储节点信息 nodes = {} for _ in range(n): addr, data, next_addr = input().split() nodes[addr] = (data, next_addr) # 构建链表 linked_list = [] current = head while current != '-1': data, next_addr = nodes[current] linked_list.append((current, data)) current = next_addr # 重排链表 new_list = [] left, right = 0, len(linked_list) - 1 while left <= right: if left == right: new_list.append(linked_list[left]) else: new_list.append(linked_list[right]) new_list.append(linked_list[left]) left += 1 right -= 1 # 输出结果 for i in range(len(new_list) - 1): addr, data = new_list[i] next_addr = new_list[i + 1][0] print(f"{addr} {data} {next_addr}") last_addr, last_data = new_list[-1] print(f"{last_addr} {last_data} -1") ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值