[LeetCode.24]两两交换链表中的节点

思路,使用三个指针,一个是指向改变前两个节点中前向节点pFirst,一个指向其中的后向节点pSecond,还有一个是该前向节点的前向节点pZero,依照题意更改该三个节点的指向即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
	ListNode* swapPairs(ListNode* head)
	{
		if (head == NULL || head->next == NULL)
			return head;
		ListNode vir(-1);                       //虚拟一个头结点的前向节点,主要匹配后续反转节点中的前向节点的正确指向
		ListNode* pZero = &vir;
		pZero->next = head;
		ListNode* pFirst = head;
		ListNode* pSecond = head->next;
		ListNode* pHead = pSecond;
		while (pSecond != NULL)                 //判断后续是否有两个以上的节点以供局部反转
		{
			pFirst->next = pSecond->next;
			pSecond->next = pFirst;
			pZero->next = pSecond;
			pZero = pSecond->next;
			pFirst = pFirst->next;
			if (pFirst == NULL)            //判断后续是否有节点
				break;
			pSecond = pFirst->next;

		}
		return pHead;
	}
};
ac为100%

猜你喜欢

转载自blog.csdn.net/weixin_39460182/article/details/80778675