题目介绍
力扣1721题:leetcode-cn.com/problems/sw…
方法:双指针定位法
声明三个节点cur、first、last全部指向head节点,利用cur从头结点开始遍历链表,first指针移动k - 1步后定位至该链表正数第k个节点,设链表的节点个数为nums,当first指针指向第k个节点时,此时链表还有nums - k个节点没有遍历。因为链表的头节点到倒数第k个节点之间的节点个数刚好也是nums - k个,所以当遍历到正数第k个节点后,last指针开始从head节点移动nums - k步后即指向了倒数第k个节点。
代码如下:
/**
* 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) {
// 模拟指针,用来遍历链表
ListNode cur = head;
// 用来定位正数第k个节点
ListNode first = head;
// 用来定位倒数第k个节点
ListNode last = head;
// 用于节点的计数,和节点值的交换
int count = 1;
while (cur.next != null) {
// 找到正数第k个节点
if (count < k) {
first = first.next;
// 找到倒数第k个节点
} else {
last = last.next;
}
count++;
cur = cur.next;
}
// 交换正数第k个节点和倒数第k个节点的值
count = first.val;
first.val = last.val;
last.val = count;
return head;
}
}