每日一题
两两交换链表中的节点
思路
- 首先我们来理解题意:题目要求我们两两交换链表中的节点,即第1个和第2个,第3个和第4个……如果最后一个为单个节点(如节点情况为 1 2 3 4 5)那么就不进行处理。注意,题目要求的是对节点进行交换,而不是修改节点内的值。
- 这道题其实和反转链表方法类似,我们可以先新建一个表头指向原来的表,从而确保交换第一个节点和第二个节点后还能返回链表的头,然后我们就可以定义一个指针cur来遍历链表,进行节点的两两交换就可以了
具体步骤
新建一个表头newHead指向原来的表头head
定义指针cur = head,prev = newHead(即cur的前一个节点),当cur和cur->next不为空时进行循环
每次循环都定义一个temp = cur->next,对cur,temp,prev三个指针进行操作,从而实现节点的交换
如图展示的就是交换第一组节点的过程
最后返回新头结点的next即可
实现代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head){
//当链表为空或只有一个节点是,不要交换,直接返回原头节点
if(head == NULL || head->next == NULL)
return head;
//建立新表头
struct ListNode *newHead = (struct ListNode *)malloc(sizeof(struct ListNode));
newHead->next = head;
struct ListNode *cur = head, *prev = newHead;
//当cur和cur->next都不为空时进行循环
while(cur && cur->next)
{
struct ListNode *temp = cur->next;
cur->next = temp->next;
temp->next = cur;
prev->next = temp;
//交换完后更新prev和cur的位置
prev = cur;
cur = cur->next;
}
return newHead->next; //返回表头
}