LeetCode两两交换链表中的节点——C

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs

一、题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.

二、题解

普遍有两种解法:递归、非递归

1、递归

struct ListNode* swapPairs(struct ListNode* head) {
	if (head == NULL || head->next == NULL) {	//为空或只有一个就不用交换 
		return head;
	}
	struct ListNode* node1 = head;				//第一个节点 
	struct ListNode* node2 = head->next;		//第二个节点 
	struct ListNode* next = node2->next;		//保存记录第二个节点后的节点引用
	
	node2->next = node1;						//第二个节点指向第一个节点
	node1->next = swapPairs(next);				//原第一个节点指向后面(交换的)的节点 
	return node2;								 
}

2、非递归

struct ListNode* swapPairs(struct ListNode* head) {
	//定义头节点 
	struct ListNode* lhead = (struct ListNode*)malloc(sizeof(struct ListNode));
	//pre用于给头节点连接,node1、node2用于交换节点,next用于开始下一次交换
	struct ListNode* pre, * node1, * node2, *next;
	lhead->next = head;							//连接到原来链表 
	pre = lhead;
	while (pre->next != NULL && pre->next->next != NULL) {
		node1 = pre->next;						//第一个节点 
		node2 = pre->next->next;				//第二个节点 
		next = node2->next;						//保存记录第二个节点后的节点引用

		pre->next = node2;						//前驱节点连到第二个节点
		node2->next = node1;					//第二个节点连到第一个节点
		node1->next = next;						//第一个节点连到后面节点
		pre = node1;							//此时前驱节点换成第一个节点,(尾插法)
	}
	return lhead->next;
}

三、调试

#include<stdio.h>
#include<malloc.h>

struct ListNode {
	int val;
	struct ListNode* next;
};

//尾插法
void CreateListR(struct ListNode*& L, int array[], int n) {
	struct ListNode* s, * r;
	L = (struct ListNode*)malloc(sizeof(struct ListNode));	//创建头结点
	r = L;										//r 始终指向尾结点,初始时指向头结点 (头结点序号为 0) 
	for (int i = 0; i < n; i++) {				//循环建立数据节点 s
		s = (struct ListNode*)malloc(sizeof(struct ListNode));
		s->val = array[i];						//赋值 
		r->next = s;							//将结点 s 插入到结点 r 之后 
		r = s;
	}
	r->next = NULL;								//尾结点其 next 域置为 NULL 
}

//输出线性表
void Display(ListNode* L) {
	struct ListNode* p = L;						//p 指向首结点 (首结点序号为 1) 
	while (p != NULL) {							//不为空,依次遍历 
		printf("%d ", p->val);
		p = p->next;							//p 移向下一个节点 
	}
	printf("\n");
}

//递归
struct ListNode* swapPairs(struct ListNode* head) {						 
}

//非递归 
struct ListNode* swapPairs(struct ListNode* head) {
}

int main() {
	struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
	int array[] = { 1,2,3,4 };
	int n = sizeof(array) / sizeof(array[0]);
	CreateListR(L, array, n);
	Display(L->next);

	struct ListNode* swapL = swapPairs(L->next);
	Display(swapL);
	return 0;
}

四、结果

1、控制台输出
在这里插入图片描述

2、递归
在这里插入图片描述

3、非递归
在这里插入图片描述

发布了113 篇原创文章 · 获赞 109 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42109012/article/details/103223391