这个题的意思是将一个链表,按照每两个节点逆序。我想了一下,主要是对链表的操作以及对指针的交换,掌握了方法以后确实不是很难,但是需要注意的是不要将指针给弄错了,否则容易导致链表信息丢失。
我的方法中使用到了四个主要指针,我画了个图来解释它们:
这四个指针的作用通过上图,大家应该能够理解了,因为我们需要做的事有三件:
(1)交换中间部分 (通过prev和cur)
(2)连接前面部分(通过pprev)
(3)连接后面部分(通过next)
代码如下:
/**
* 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 *Head = head->next;
//四个指针
//该指针指向交换部分的第一个节点
ListNode *prev=head;
//该指针指向交换部分的第二个节点
ListNode *cur=head->next;
//指向下一个需要的交换的部分,用于连接链表
ListNode *next = cur->next;
cur->next = prev;
prev->next = NULL;
//指向交换部分的前面的序列的末尾
ListNode *pprev=prev;
while(next)
{
prev = next;
cur = prev->next;
if(cur == NULL)
{
pprev->next = prev;
break;
}
next = cur->next;
cur->next = prev;
prev->next = NULL;
pprev->next=cur;
pprev=prev;
}
return Head;
}
};