给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
递归法
//首先要先设置一个新组的头节点,此新组的头节点是需要交换组的组原后节点。然后递归调用函数,当链表为空出栈,这样就使得原组头节点指向空,然后再将此新组的头节点指向原组的头节点节点。完成最后一组的交换,若最后一组只有一个节点,则直接返回此节点。
//然后逐渐递归前组,最后递归到第一组的两个节点,返回新组头节点即可
class Solution {
public ListNode swapPairs(ListNode head) {
//这里判断剩余节点是否含有next节点,或节点是否为空。
if(head == null || head.next == null){
return head;
}
//首先要先设置一个新组的头节点,此新组的头节点是需要交换组的组原后节点。然后递归调用函数,当链表为空出栈,这样就使得原组头节点指向空,然后再将此新组的头节点指向原组的头节点节点。完成最后一组的交换,若最后一组只有一个节点,则直接返回此节点。
//然后逐渐递归前组,最后递归到第一组的两个节点,返回新组头节点即可
ListNode fir = head.next;
head.next = swapPairs(fir.next);
fir.next = head;
return fir;
}
}
迭代法
首先要设置一个新的节点,新节点的下个节点指向原头节点(为了返回值时更方便),再设置一个指针节点,作为目前的指针,然后在循环中设置下个节点和下下个节点。进行交换操作,最后再让指针指向交换以后的后一个节点。若指针的下个节点和下下个节点为空,则跳出循环,无需交换。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode(0);
pre.next = head;
ListNode temp = pre;
while(temp.next != null && temp.next.next != null){
ListNode node1 = temp.next;
ListNode node2 = temp.next.next;
temp.next = node2;
node1.next = node2.next;
node2.next = node1;
temp = node1;
}
return pre.next;
}
}