leetcode-24 两两交换链表中的节点

题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

方法一(递归):
将配对交换过程拆解为多个以两个元素为一对的子问题
…n(k-1) -> n(k)->n(k+1)->…
假如n(k+1)之后已经完成逆置,此时置换之后…->n(k-1)->n(k+1)->n(k)->…

Node *p = head -> next;
head -> next = p -> next;
p -> next = head;

实现如下:

ListNode* swapPairs(ListNode* head) {
    if(head == NULL || head -> next == NULL) {
    	return head;
    }
	ListNode *p = head -> next;
	head -> next = swapPairs(p -> next);
	p -> next = head;
	
	return p;
}

方法二(非递归):
在这里插入图片描述
构造一个虚拟的头节点,同时当前链表遍历的结束条件:
如果链表长度为偶数,那么p->next->next = NULL
如果链表长度为奇数,那么p->next = NULL

p代表当前节点的上一个节点,next代表置换两个之后的下一个节点。

同时两两交换之后的相互指向形态为:
node2 -> next = node1;
node1 -> next = next;
p -> next = node2;

p = node1;

ListNode* swapPairs(ListNode* head) {
    ListNode * dummHead = new ListNode(0);
    dummHead->next = head;

    ListNode *p = dummHead;
    while(p->next && p->next->next){
        ListNode * node1 = p->next;
        ListNode * node2 = node1->next;
        ListNode * next = node2->next;

        node2->next = node1;
        node1->next = next;
        p->next = node2;
        
        p = node1;
    }
    return dummHead->next;      
}
发布了239 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Z_Stand/article/details/104323775