思路,使用三个指针,一个是指向改变前两个节点中前向节点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%