【算法分析与设计】交换两个节点

       个人主页:五敷有你      
 系列专栏:算法分析与设计
⛺️稳中求进,晒太阳

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 示例

示例 1:

【算法分析与设计】交换两个节点_第1张图片

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

思路


这里我们需要三个指针,p,q,temp。
假设链表是
1->2->3->4->5->6
在迭代的时候,每次处理两个节点,于是第一轮 p指向 1,q 指向 2。
第二轮的时候 p 指向 3,q 指向 4。第三轮的时候 p 指向 5,q 指向 6。
我们通过 a.next = b.next,以及b.next=a就把两个指针的位置反转了,于是1->2就变成2->1。
但这里有一个细节需要处理,当我们第二轮迭代的时候,p 指向 3,q 指向 4。按照题目要求,最终应该是2->1->4->3。
也就是节点 1 需要跟节点 4 串起来,只有两个指针就没法弄了,所以需要第三个指针 tmp,用来记录上一轮 p 的位置,然后下一轮迭代的时候,将原先的 p(也就是节点 1)指向 4。

1.初始化:

申请一个节点,方便后续操作。

【算法分析与设计】交换两个节点_第2张图片

2.  p指向1 q指向2

【算法分析与设计】交换两个节点_第3张图片

3.  tmp.next = b;  a.next = b.next; (操作过程中不要丢失节点)

现在节点的顺序是2 1 3 4 

【算法分析与设计】交换两个节点_第4张图片

 不好看,那我转一下(是不是清晰多了) ,一次调换两个节点

【算法分析与设计】交换两个节点_第5张图片

 4. 接下来 temp和p q指向 1 ,来操作后两个节点,

【算法分析与设计】交换两个节点_第6张图片

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode pre=new ListNode(-1);
        ListNode p=pre;
        ListNode q=pre;
        
        pre.next=head;
        ListNode temp=pre;
        while(q!=null&&q.next!=null&&q.next.next!=null){

            
            p=p.next;
            q=q.next.next;

            temp.next=q;
            p.next=q.next;
            q.next=p;


            temp=p;
            q=p;
        }
        return pre.next;
    }
}

运行结果

【算法分析与设计】交换两个节点_第7张图片

你可能感兴趣的:(算法分析与设计,算法,数据结构,leetcode)