简书内代码已上传GitHub:点击我 去GitHub查看代码
点击 这里 跳转到LeetCode官网查看题目
点击 这里 跳转到LeetCode中国官网查看题目
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
中文:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路:
这道题要注意两点
- 给定的链表可能是空表
- 给定的链表节点数可能是奇数个
理解以上两点后写起来就不难啦,对链表进行遍历,步长为二。每次遍历交换节点,并连接左节点的前驱和右节点的后继.并在只剩单节点或链尾跳出循环。
Accept by C:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head){
struct ListNode* p , *pre, *result;
//如果是空链表或单节点,直接返回。
if(!head || !(head ->next)){
return head;
}else
//返回链表的头节点为第二个节点
result = head -> next;
//存储前一个节点
pre = NULL;
//遍历
while(head){
//剩余单独节点,跳出循环
if(head -> next == NULL)
break;
//交换
p = head -> next;
head -> next = p -> next;
p -> next = head;
//除了首元,其余元素都有前一个节点(偶数节点)
if(pre) pre -> next = p;
//交换后与前一个节点接上
pre = head;
//向前遍历
head = head -> next;
}
return result;
}

每天进步一点,加油!

END
网友评论