1721-交换链表中的节点

Raphael Liu Lv10

给你链表的头节点 head 和一个整数 k

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引 )。

示例 1:

![](https://assets.leetcode-cn.com/aliyun-lc-
upload/uploads/2021/01/10/linked1.jpg)

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

示例 2:

**输入:** head = [7,9,6,6,7,8,3,0,9,5], k = 5
**输出:** [7,9,6,6,8,7,3,0,9,5]

示例 3:

**输入:** head = [1], k = 1
**输出:** [1]

示例 4:

**输入:** head = [1,2], k = 1
**输出:** [2,1]

示例 5:

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

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 105
  • 0 <= Node.val <= 100

解题思路

此处撰写解题思路

代码

/**
 * 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 swapNodes(ListNode head, int k) {
        if(k<=0) {
            return null;
        }
        ListNode cur=head;
        ListNode curprev=null;
        ListNode slow=head;
        ListNode slowprev=null;
        ListNode fast=head;
        //目的:找到正数第k个和倒数第k个
        while((k--)-1!=0) {
            fast=fast.next;
            if(fast==null) {
                return null;
            }
            curprev=cur;      //找到cur前一个结点
            cur=cur.next;     //cur走k-1步刚好到正数k的位置
        }
        while(fast.next!=null) {
            slowprev=slow;
            fast=fast.next;
            slow=slow.next;
        }                    //slow就是倒数第k的位置





        ListNode curnext=cur.next;
        ListNode slownext=slow.next;

        ////如果要交换的是相邻的两个结点
        if(cur.next==slow) {   
            if(curprev==null) {    //如果这两个结点相邻并且是头尾节点的情况
                slow.next=cur;
                cur.next=null;
                return slow;
            }
            curprev.next=slow;
            slow.next=cur;
            slowprev.next=null;
            cur.next=slownext;
            return head;
        }
        //这里表示k的值大于链表长度一半是会导致,slow在cur的左边
        if(slow.next==cur) {
            if(slowprev==null) {    //如果这两个结点相邻并且是头尾节点的情况
                cur.next=slow;
                slow.next=null;
                return cur;
            }
            slowprev.next=cur;
            cur.next=slow;
            curprev.next=null;
            slow.next=curnext;
            return head;
        }



        //如果slow没有动,而cur已经走到最后(因为根据上面的逻辑是:cur和fast根据k的值走,如果k等于这个链表的长度那么就会造成这个问题)
        if(slow==head&&slownext!=null) {
            curprev.next=curnext;
            cur.next=slownext;
            curprev.next=slow;
            slow.next=null;
            return cur;
        }


        //如果只有一个结点
        if(slowprev==null) {
            return head;
        }





        slowprev.next=slownext;
        //slow在cur右边时执行的逻辑
        if(curprev==null) {   //表示要交换的是头和尾结点
            slow.next=curnext;
            slowprev.next=head;
            head.next=null;
            return slow;
        }

        //正常逻辑
        curprev.next=curnext;
        curprev.next=slow;
        slow.next=curnext;
        slowprev.next=cur;
        cur.next=slownext;
        return head;
    }
}
 Comments
On this page
1721-交换链表中的节点