力扣题目链接
本题采用两个节点两个节点处理的方式,若仅剩一个节点则不用处理,具体代码以及详细注释如下:
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode cur = head;//当前所在位置
if(head == null) return head;
else if(head.next == null) return head;//若链表为空或只有一个节点则直接返回头节点
else if(head.next != null) head = head.next;//若多于两个节点则将头节点改为第二个节点
ListNode pre = null;//保存已经处理过的节点的尾节点,用于恢复与后面节点的链接
ListNode temp = null;//保存cur后的第二个节点
while(cur != null){
if(cur.next != null){//有两个待反转的节点
temp = cur.next.next;//保存cur后的第二个节点
cur.next.next = cur;//将当前节点后的第一个节点的next指向当前节点
if(pre != null){
pre.next = cur.next;//与前边处理过后的链表相连
}
cur.next = temp;//实现反转
pre = cur;//一次反转完成,修改pre指向节点位置
cur = temp;//修改cur指向节点位置
}
else{
cur = cur.next;//仅剩一个节点,不用反转,退出循环
}
}
return head;
}
}



