两两交换链表中的节点(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; } }