单向链表不断链原则
前言
对于单向链表操作的基本功之一,就是不断链。单向链表不断链原则,把后面被动的节点先接上。再操作用指针指到的节点,反正有指针指,不会丢失。
一、两两交换链表中的节点
二、不断链
package everyday;
// 两两交换链表中的节点
public class SwapPairs {
/*
target:把链表相邻偶数奇数节点交换。
在这里,主要就涉及链表断链问题,如果能拿到两节点的前一个和后一个就不成问题。
为了统一第一个节点的操作,可加上dummyHead;
*/
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode dummyHead = new ListNode(0, head);
ListNode p = dummyHead, q = dummyHead.next;
while (q != null && q.next != null) {
// q记住第一个节点去,p记住q前面的节点,先把q后面的链表接到p后,再把q嵌入进去(毕竟单向链表,先把后面的接上来)。
// 注:单向链表不断链原则,把后面被动的节点先接上。再操作用指针指到的节点,反正有指针指,不会丢失。
p.next = q.next;
q.next = p.next.next;
p.next.next = q;
// 更新pq
p = q;
q = q.next;
}
return dummyHead.next;
}
// 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;
}
}
}
总结
1)单向链表不断链原则,把后面被动的节点先接上。再操作用指针指到的节点,反正有指针指,不会丢失。