1. 题目 要求:
上链接:
https://leetcode-cn.com/problems/swap-nodes-in-pairs/
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例2:
输入:head = [] 输出:[]
示例3:
输入:head = [1] 输出:[1]
1.1 思路:
如果要实现两两交换,比如[1, 2, 3, 4,5],先把1,2进行交换,然后把3,4进行交换,看起来思路很简单,其中会有好几个坑,我慢慢分析:
先上图
先做一下解释,首先定义一个头结点 head , 表示第0号节点,node1表示第一个节点,node2表示第2个节点,以此类推。定义 temp 节点,刚开始指向head头节点,功能是 作为移动节点 。
- 首先,头结点head指向第2个节点,即node2节点。
- 之后,如果node2直接指向node1,node3 会找不到,因此我们先把 node1 和 node3相连。
- 最后,把node2和node1相连。
- temp 指向 第二个节点,即现在的node1的位置。重复以上步骤即可。
- 注意:迭代结束的条件:
- 假如 temp 此时指向第 2n(表示偶数) 个节点。如果temp后面没有节点,那么直接返回即可;
- 如果temp后面有一个节点,后面就1个节点,不需要交换,然后返回头结点即可。
- 如果temp后面有2个节点,则需要进行交换。
1.1.2 实现
使用C语言进行实现:
- 定义结构体 node 节点:
// 1.结构体的应用:单链表 typedef struct Node{ int data; //数据域 struct Node *next; //指针域 }Node;
- 构建 init() 方法,初始化头结点
void init(Node *head){ head->data = 0; head->next = NULL; printf("init......\n"); }
- 构建append() 方法,添加节点。
//2.添加 节点 void append(Node *head, int n){ //1.申请 node 节点,存储要插入的数 Node *node = (Node *)malloc(sizeof(Node)); node->data = n; node->next = NULL; //2.定义移动节点temp指向头结点 Node *temp = head; //3.遍历找到最后一个元素 while(temp->next != NULL){ temp = temp->next; } //4.node节点连接到尾节点 temp->next = node; }
- 构建out() 方法,输出节点
//3.输出节点 void out(Node *head){ printf("out......\n"); head = head->next; while(head != NULL){ printf("%d\t", head->data); head = head->next; } }
-
构建*swapPairs(),实现两两交换
//4.两两交换链表中的节点 Node *swapPairs(Node *head){ printf("swapPairs...\n"); if(size(head) == 0){ return NULL; } if(size(head) == 1){ return head; } int count = 0; Node *temp = head; // 1.定义移动节点,开始指向头结点 while(temp != NULL){ Node *node1 = temp->next; // node1 指向 第1个节点 Node *node2 = temp->next->next; // node2 指向第2个节点 // 第2个节点指向头节点 temp->next = node2; // 第1个节点指向第3个节点 node1->next = node2->next; // 第2个节点指向第1个节点 node2->next = node1; // temp 指向第 2 个节点, 现在 node1 和 node2 交换了位置,故node1是第2个节点 temp = node1; printf("第%d次:\n", count); out(head); printf("-------------------\n"); count++; if(temp->next == NULL){ return head; }else if(temp->next->next == NULL){ return head; }else{ } } return head; }
-
构建size() 方法,返回 节点的个数。
int size(Node *head){ printf("size....\n"); int size = 0; Node *temp = head->next; while(temp != NULL){ size++; temp = temp->next; } return size; }
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
// 1.结构体的应用:单链表
typedef struct Node{
int data; //数据域
struct Node *next; //指针域
}Node;
void init(Node *head){
head->data = 0;
head->next = NULL;
printf("init......\n");
}
//2.添加 节点
void append(Node *head, int n){
//1.申请 node 节点,存储要插入的数
Node *node = (Node *)malloc(sizeof(Node));
node->data = n;
node->next = NULL;
//2.定义移动节点temp指向头结点
Node *temp = head;
//3.遍历找到最后一个元素
while(temp->next != NULL){
temp = temp->next;
}
//4.node节点连接到尾节点
temp->next = node;
}
//3.输出节点
void out(Node *head){
printf("out......\n");
head = head->next;
while(head != NULL){
printf("%d\t", head->data);
head = head->next;
}
}
//4.两两交换链表中的节点
Node *swapPairs(Node *head){
printf("swapPairs...\n");
if(size(head) == 0){
return NULL;
}
if(size(head) == 1){
return head;
}
int count = 0;
Node *temp = head; // 1.定义移动节点,开始指向头结点
while(temp != NULL){
Node *node1 = temp->next; // node1 指向 第1个节点
Node *node2 = temp->next->next; // node2 指向第2个节点
// 第2个节点指向头节点
temp->next = node2;
// 第1个节点指向第3个节点
node1->next = node2->next;
// 第2个节点指向第1个节点
node2->next = node1;
// temp 指向第 2 个节点, 现在 node1 和 node2 交换了位置,故node1是第2个节点
temp = node1;
printf("第%d次:\n", count);
out(head);
printf("-------------------\n");
count++;
if(temp->next == NULL){
return head;
}else if(temp->next->next == NULL){
return head;
}else{
}
}
return head;
}
int size(Node *head){
printf("size....\n");
int size = 0;
Node *temp = head->next;
while(temp != NULL){
size++;
temp = temp->next;
}
return size;
}
void main(){
//1.初始化头结点
Node *head = (Node *)malloc(sizeof(Node));
init(head);
// printf("the data of head is %d\n", head->data);
// printf("the next of head is %d\n", head->next);
append(head, 1);
append(head, 2);
append(head, 3);
append(head, 4);
append(head, 5);
append(head, 6);
out(head);
int len = size(head);
printf("\n长度:%d\n", len);
head = swapPairs(head);
printf("最后的输出:");
out(head);
}