两两交换链表中的节点(java实现)

题目:

 

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.
这个题不是简单的数字交换,而是节点之间的交换。
代码如下:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode tmp =new ListNode(0);  //申请一个空的节点
        tmp.next = head;  //让链表的头节点指向那个空节点的下一个节点
        
        ListNode temp = tmp;  //把这个空节点保存下来,用这个变量去完成交换
        while(head != null && head.next !=null){
            temp.next = head.next;
            head.next = temp.next.next;
            temp.next.next = head;
            temp = temp.next.next;  //当上面交换完了后,temp向后移两个节点。
            head = temp.next;
        }
        return tmp.next; //返回空节点之后已经交换完了的链表
    }
}

 法二:

把节点一个一个取出来,两个两个一交换,用递归实现,

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode res = head.next; //找到交换节点的下一个
         ListNode temp = swapPairs(head.next.next);  //需要移动头部
        res.next = head; //交换
        head.next = temp; //头部移动到下一组
       
        return res;
    }
}

 

 

 

posted @ 2019-04-26 12:47  离愁i  阅读(2009)  评论(0编辑  收藏  举报