两两交换链表中的节点
leetcode题目:24,输入:1–>2–>3–>4–>5 输出:2–>1–>4–>3–>5
显然,交换之后,prev->next的值已经发生变化,所以使用虚拟头节点,并用prev来遍历节点
普通节点的交换:
初始化:
ListNode *dummyHead = new ListNode(0, head);
ListNode *prev = dummyHead, *cur = NULL;
奇数个节点的情况:
cur -> next =NULL
对此修改进入循环的条件为:
while(prev -> next && prev -> next -> next)
对于 prev -> next != NULL,而 prev -> next -> next == NULL,则对应于奇数的节点的最后一个节点。
完整程序
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* vHead = new ListNode(0, head);
ListNode* cur, *prev = vHead;
while(prev -> next != NULL && prev -> next -> next != NULL)
{
cur = prev -> next;
prev -> next = cur -> next;
cur -> next = prev -> next -> next;
prev -> next -> next = cur;
prev = cur;
//cur = cur -> next;
}
head = vHead -> next;
delete vHead;
return head;
}
};
delete vHead;
return head;
}
};