leetcode解题报告24. Swap Nodes in Pairs

来源:互联网 发布:nginx websocket 转发 编辑:程序博客网 时间:2024/06/03 17:36

leetcode解题报告24. Swap Nodes in Pairs

题目地址

难度是medium

题目描述

给定一个链表,把相邻的元素交换位置
比如
给定1->2->3->4->5
变成2->2->4->3->5

我的思路

题目的核心操作是交换两个相邻元素,如果链表长度是2,则问题就变成简单的交换两个相邻元素。于是可以考虑用递归的方法,每次只处理两个元素。当然用循环遍历的方式逐步处理应该也是可以的,但是这时处理头指针比较麻烦。用递归的方式代码会更简洁

我的代码

递归版本

/** * 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) {        return func(head);    }    ListNode* func(ListNode* head) {        if (head == NULL || head->next == NULL)            return head;        ListNode *p1, *p2;        p1 = head->next;        p2 = head->next->next;        p1->next = head;        head->next = func(p2);        return p1;    }};

循环版本

/** * 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 *p0, *p1, *p2;        p0 = head;        p1 = head->next;        p2 = head->next->next;        head = head->next;        ListNode *tail = NULL;        while (true) {            p1->next = p0;            p0->next = p2;            if (tail == NULL) {                tail = p0;            } else {                tail->next = p1;                tail = p0;            }            if (p2 == NULL || p2->next == NULL) {                return head;            } else {                p0 = p2;                p1 = p2->next;                p2 = p2->next->next;            }        }        return head;    }};

阅读官方题解

没有官方题解。

思想核心总结

链表的问题要善于画图

原创粉丝点击