import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode swapCows (ListNode head) {
        // 当队列为空或只有一个牛时,无需排序,直接返回
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode prev = dummy; // 前驱节点
        ListNode curr = head; // 当前节点

        while (curr != null && curr.next != null) {
            ListNode nextNode = curr.next; // 下一个节点

            curr.next = nextNode.next; // 当前节点指向下下个节点
            nextNode.next = curr; // 下一个节点指向当前节点
            prev.next = nextNode; // 前驱节点指向下一个节点

            prev = curr; // 更新前驱节点为当前节点
            curr = curr.next; // 更新当前节点为下一个节点
        }

        return dummy.next; // 返回交换后的牛群的链表头节点
    }
}

本题知识点分析:

1.链表反转

2.数学模拟

本题解题思路分析:

1.当队列为空或只有一个牛时,无需排序,直接返回

2.分别保存前驱结点和当前节点

3.注意循环条件 while (curr != null && curr.next != null)

4.循环内代码按注释即可知晓

5.链表的题目画图,然后按图翻译就可以了,注意虚拟头结点问题,然后什么时候判空

本题使用编程语言: Java

如果您觉得本篇文章对您有帮助的话,可以点个赞支持一下,感谢~