题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swacurrent_nodecurrent_nodeairs(struct ListNode* head) {
//在此处编写代码
}
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题解
思路: 当然最简单的是直接交换相邻的两个链表中的val值,然而如果结构题中有很多成员变量呢?所以我选择练习交换节点。
note:注意单数节点情况以及只有一个节点的情况
struct ListNode* swacurrent_nodecurrent_nodeairs(struct ListNode* head) {
struct ListNode *current_node = head, *next_node, *pre_node;
if (head == NULL || head->next == NULL)return head;
head = head->next;
while (current_node != NULL && current_node->next != NULL) {
next_node = current_node->next;
current_node->next = next_node->next;
next_node->next = current_node;
if (next_node != head) {
pre_node->next = next_node;
}
pre_node = current_node;
current_node = current_node->next;
}
return head;
}
用虚拟头结点就只用两个指针
struct ListNode* swapPairs(struct ListNode* head) {
struct ListNode *current_node = NULL, *next_node = head, ret;
ret.next = head;
current_node = &ret;
while (next_node != NULL && next_node->next != NULL) {
current_node->next = next_node->next;
next_node->next = current_node->next->next;
current_node->next->next = next_node;
current_node = next_node;
next_node = next_node->next;
}
return ret.next;
}
LeetCode习题汇总