只交换值:
用 leftK
表示正数第 k
个节点,rightK
表示倒数第 k
个节点。初始化指向 head
,leftK
前进 k-1
步就成了正数第 k
个节点,然后 temp
指向 leftK
,让 rightK
和 temp
同时前进,直到 temp
到达最后一个节点,此时 rightK
就成了倒数第 k
个节点,最后交换 leftK
和 rightK
的 val
。
class Solution {
public ListNode swapNodes(ListNode head, int k) {
ListNode leftK = head, rightK = head;
while(k-1 > 0){
leftK = leftK.next;
k--;
}
ListNode temp = leftK;
while(temp.next != null){
rightK = rightK.next;
temp = temp.next;
}
int value = leftK.val;
leftK.val = rightK.val;
rightK.val = value;
return head;
}
}
交换节点:快慢指针,思路和上述一致,只是因为交换节点,所以是要得到正数第k个节点的前驱节点和倒数第k个节点的前驱节点
class Solution {
public ListNode swapNodes(ListNode head, int k) {
ListNode dummy=new ListNode(0,head);
ListNode kNodePre=dummy;
// 正数第k个节点的前驱节点
for(int i=1;i<k;i++) kNodePre=kNodePre.next;
ListNode slow=dummy,fast=kNodePre.next;
while(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
if(kNodePre!=slow){
// 正数第k个节点和倒数第k个结点
ListNode kNode=kNodePre.next ,lastKNode=slow.next;
// 正数第k个节点和倒数第k个结点的前驱
slow.next=kNode;
kNodePre.next=lastKNode;
// 交换节点
ListNode tmp=lastKNode.next;
lastKNode.next=kNode.next;
kNode.next=tmp;
}
return dummy.next;
}
}