Swap Nodes in Pairs--LeetCode

这篇博客讨论了LeetCode上的一个问题——交换链表中相邻节点,并提供了使用常数空间的C++实现。思路是通过拆分再合并链表来完成节点交换,不修改链表值,只操作节点本身。

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

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

思路:将链表拆分,然后再合并

List *swapPairs(List *head) {
    if(head == NULL || head->next == NULL)
     return head;
    List* ji=head;
    List* ou = head->next;
    List* temp1,*temp2;
    List* l1= head;
    List* l2 = head->next;
    temp1 = l2->next;
    while(temp1 != NULL)
    {
      temp2 = temp1->next;
      l1->next = temp1;
      l2->next = temp2;
      l1 = temp1;
      l2 = temp2;
      if(l2 !=NULL)
      temp1 = l2->next;
      else
      temp1 = NULL;
    }
    if(l1 != NULL)
    l1->next =NULL;
    if(l2 != NULL)
    l2->next = NULL;
    temp1 = ou;
    while(temp1 != NULL&&temp1->next != NULL)
    { 
       temp2 = ji->next;
       ji->next = temp1->next;
       temp1->next = ji;
       temp1 = ji->next;
       ji = temp2;         
    }
    temp1->next = ji;
    return ou;
} 

上面的思路是将一个链表拆分然后再合并,这里仍然使用一个新的节点来作为指引节点来操作。

List* SwapNode(List* list)
{
	List* head=new List;
	head->next = list;
	List* cur = head;
	List* pre,*next;
	while(cur->next != NULL && cur->next->next != NULL)
	{
		pre = cur->next;
		next = cur->next->next;
		cur->next = next;
		next = next->next;
		cur->next->next = pre;
		pre->next = next;
		cur = pre;
	}
	return head->next;
}
ps:其实问题的思路非常的简单,但是解决问题的方法决定了处理问题的简易程度,比如我们始终使用一个指针的next域来指向准备反转的一对指针的第二个指针,然后再反转这对指针即可,这里使用一个伪指针来处理这个问题非常的合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值