<LeetCode>24. 两两交换链表中的节点

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

示例:

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

说明:


  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

/**
 * 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* node = head;
        head = node->next;
        ListNode* pre = NULL;
        
        while(node != NULL && node->next != NULL){
            ListNode* tmp = node;
            if(pre == NULL){
                pre = node; 
            }
            else{
                pre->next = node->next;
                pre = node;
            }
            node = tmp->next->next;
            if(node == NULL || node->next == NULL){
                pre->next = tmp->next;
                tmp->next->next = tmp;
                tmp->next = node;
                break;
            }
            tmp->next->next = tmp;
        }
        return head;
    } 
};

另一种更好的思路

public class Solution {
    /**
     * @param head a ListNode
     * @return a ListNode
     */
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        head = dummy;
        while (head.next != null && head.next.next != null) {
            ListNode n1 = head.next, n2 = head.next.next;
            // head->n1->n2->...
            // => head->n2->n1->...
            head.next = n2;
            n1.next = n2.next;
            n2.next = n1;

            // move to next pair
            head = n1;
        }

        return dummy.next;
    }
}

猜你喜欢

转载自blog.csdn.net/w8253497062015/article/details/81018297