题目描述
给定一个链表,请你把链表的节点进行两两交换,然后返回交换后的链表。如果只剩一个节点则不需要交换
示例1:
示例2:
解题思路:
把整个链表看成按照两两节点拆分的多个子链表,每个子链表完成交换后,再拼回原链表中即可。
代码实现:
public class SwapListNode {
public static void main(String[] args) {
SwapListNode c = new SwapListNode();
ListNode n = new ListNode(1);
ListNode head = n;
for (int i = 2; i < 5; i++) {
n.next = new ListNode(i);
n = n.next;
}
System.out.println(c.swapListNode(head));
}
public ListNode swapListNode(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode helpNode = dummy;
while (helpNode.next != null && helpNode.next.next != null) {
//此处处理可看图解
ListNode node1 = helpNode.next;
ListNode node2 = helpNode.next.next;
helpNode.next = node2;
node1.next = node2.next;
node2.next = node1;
helpNode = node1;
}
return dummy.next;
}
}
图解过程:
ListNode node1 = helpNode.next;
ListNode node2 = helpNode.next.next;
helpNode.next = node2;
node1.next = node2.next;
node2.next = node1;
helpNode = node1;
重新排列下,就变成如下结构了,接着第二次遍历循环继续重复此流程即可。