题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
输入:head = []
输出:[]
输入:head = [1]
输出:[1]
方法一:迭代法
struct ListNode* swapPairs(struct ListNode* head){
struct ListNode *newHead = malloc(sizeof(struct ListNode));//创建一个新的结点
struct ListNode *node1,*node2;//指向两个相邻的结点
struct ListNode *p;
p=newHead;
p->next = head;
while(p->next && p->next->next)
{
node1 = p->next;
node2 = p->next->next;
p->next = node2; //移动指针p
node1->next = node2->next;
node2->next = node1;
p=node1;
}
return newHead->next;
}
方法二: 递归法
struct ListNode* swapPairs(struct ListNode* head){
if(head == NULL || head->next == NULL)//对特殊情况的处理 链表为空或者只有一个结点
return head;
struct ListNode *node = head->next;//保留第二个结点的信息
head->next = swapPairs(node->next);//第一个结点的后继结点使用递归得到
node->next = head;//第二个结的后继指向第一个结点
return node;//返回第二个结点
}