Leetcode:两两交换链表中的节点(#24)

题目描述:
在这里插入图片描述
解法:
1.迭代
   思路:将两个节点操作看为一步,让前驱节点指向后驱节点的下一节点,后驱节点指向前驱节点,以及前驱结点的前一节点指向后驱节点,达到交换节点的目的。条件是前驱结点和后驱节点都不为空。
   代码:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dump = new ListNode(-1);		//哑节点指向该链表
        dump->next = head;
        ListNode* temp = dump;
        while (temp->next != nullptr && temp->next->next != nullptr) {
			ListNode* first = temp->next;
            ListNode* second = first->next;
            first->next = second->next;			//前驱节点first指向second->next
            second->next = first;				//后驱节点指向前驱节点
            temp->next = second;
            temp = first;
        }
        return dump->next;
    }
}

2.遍历
   思路:终止条件是 first 或 head->next 为 nullptr ,此时只有一个或没有节点,无法再进行交换。调用单元是 head 指向交换后的子链表,head->next 指向 head,然后返回 head->next。
   代码:

	ListNode* swapPairs(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* first = head;
        ListNode* second = head->next;

        first->next = swapPairs(second->next);
        second->next = first;
        
        return second;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值