交换两个链表节点

本文探讨了链表问题中常见的节点交换操作。通过创建带有头节点的链表来处理特殊情况,避免边界问题。重点在于找到需要交换的节点并正确连接它们,避免简单的赋值导致的错误。代码实现中使用临时变量tmp成功解决交换节点时可能遇到的坑。

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

在链表有关的问题当中,链表节点交换是一个非常 典型的一道题目,先给代码,后总结。

#include <iostream>
using namespace std;
struct Node
{
	int data;
	Node *next;
	Node(int _data=0,Node *_next=NULL):data(_data),next(_next){}
};

Node *create(int n,int *data)
{
	Node *head,*tail,*s;
	head = new Node;
	tail=head;
	for (int i = 0; i < n; i++)
	{
		s = new Node(data[i],NULL);
		tail->next = s;
		tail = s;
	}
	return head;
}

void display(Node *head)
{
	Node *p = head->next;
	while (p)
	{
		cout << p->data<<" ";
		p = p->next;
	}
	cout << endl;
}

Node *findprenode(Node *head,int preorder)
{
	Node *preNode;
	preNode = head;
	for (int i = 0; i < preorder; i++)
	{
		preNode = preNode->next;
	}
	return preNode;
}

Node *findnextnode(Node *head, int nextorder)
{
	Node *nextNode;
	nextNode = head;
	for (int i = 0; i < nextorder; i++)
	{
		nextNode = nextNode->next;
	}
	return nextNode;
}

void swap(Node *head, int preorder1, int nextorder1,int preorder2,int
链表交换两个节点的位置,通常可以通过以下步骤实现: ### 1. 交换节点的值 如果仅需要交换两个节点的值而不改变节点本身的位置,可以直接访问这两个节点交换它们的值。这种方法适用于单链表和双链表。 ```python def swap_values(node1, node2): node1.val, node2.val = node2.val, node1.val ``` ### 2. 交换节点本身的位置 如果需要交换两个节点本身的位置,则需要调整它们的前驱和后继指针。以下是针对单链表的实现方法: #### 实现步骤: 1. **找到两个节点的前驱节点**:因为链表无法直接访问前驱节点,需要从头节点开始遍历,找到两个目标节点的前驱节点。 2. **调整指针**:根据找到的前驱节点和目标节点,调整它们之间的链接关系,完成节点交换。 #### 示例代码: 以下代码实现了交换链中任意两个节点的功能,假设链表中没有重复值,且 `node1` 和 `node2` 是链表中的有效节点。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def swap_nodes(head, node1, node2): if node1 == node2: return head # 不需要交换 # 找到 node1 和 node2 的前驱节点 prev1 = None curr1 = head while curr1 and curr1 != node1: prev1 = curr1 curr1 = curr1.next prev2 = None curr2 = head while curr2 and curr2 != node2: prev2 = curr2 curr2 = curr2.next # 如果 node1 或 node2 不存在,返回原链表 if not curr1 or not curr2: return head # 交换 node1 和 node2 的前驱指针 if prev1: prev1.next = curr2 else: head = curr2 # node1 是头节点 if prev2: prev2.next = curr1 else: head = curr1 # node2 是头节点 # 交换 node1 和 node2 的后继指针 curr1.next, curr2.next = curr2.next, curr1.next return head ``` ### 3. 交换相邻节点 如果需要交换相邻的两个节点(例如链表中两两交换节点),可以使用虚拟头节点简化操作。以下是迭代方法的实现: ```python def swap_adjacent_nodes(head): dummy = ListNode(0) dummy.next = head prev = dummy while head and head.next: # 定义两个相邻节点 first = head second = head.next # 调整指针完成交换 prev.next = second first.next = second.next second.next = first # 更新指针 prev = first head = first.next return dummy.next ``` ### 4. 交换非相邻节点 如果两个节点之间有间隔,可以采用与交换相邻节点类似的方式,但需要分别调整它们的前驱和后继指针。确保找到两个节点的前后关系,并正确更新指针。 ### 5. 注意事项 - 在链表交换节点时,需要特别注意节点的前后关系,避免断链或形成循环。 - 如果链表中有重复值,需要确保找到正确的节点。 - 对于双链表,除了调整 `next` 指针,还需要调整 `prev` 指针。 ### 相关问题 1. 如何交换链中相邻的两个节点? 2. 如何交换链两个非相邻节点? 3. 如何判断链表中是否存在某个节点? 4. 如何实现链表的两两交换节点? 5. 如何在双链表交换两个节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值