题目
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
思路一:把链表放到list中,这样就可以通过索引下标来定位我们要找到的两个交换节点。
public ListNode swapNodes(ListNode head, int k) {
// 创建列表
List<ListNode> list = new ArrayList<>();
// 把链表的节点加到list中
while(head!=null){
list.add(head);
head = head.next;
}
// 通过索引下标找到所需的两个节点
int reverse_k = list.size() - k;
ListNode temp = list.get(k-1);
// 交换,其实我这里交换的是节点,不仅仅是val而已
list.set(k-1,list.get(reverse_k));
list.set(reverse_k,temp);
ListNode result = new ListNode(0,null);
result.next = list.get(0);
ListNode ls = result.next;
// 合并链表
for (int i = 1; i <list.size() ; i++) {
ls.next = list.get(i);
ls = list.get(i);
}
// 返回
ls.next = null;
return result.next;
}
这题一开始做我以为是要交换节点,最后发现是交换val就行了。
思路二:快慢指针,快指针先找,找到正序K之后,快慢一起遍历,等快指针为空时,此时的慢指针就是倒序K了。
public ListNode swapNodes(ListNode head, int k) {
// 带头节点的链表,快慢指针都从这里出发
ListNode dummy = new ListNode(0,head);
// first用来指向找到的正序k节点
ListNode first = new ListNode();
ListNode fast = dummy;
ListNode slow = dummy;
// 找正序k
while(k!=0){
fast = fast.next;
k--;
}
first = fast;
// 找倒序k
while(fast!=null){
slow = slow.next;
fast = fast.next;
}
// 交换val
int temp = first.val;
first.val = slow.val;
slow.val = temp;
return dummy.next;
}