Description:
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
题意:给定一个链表,对于每两个节点,交换这两个节点(不可以仅通过交换值来实现交换节点)
解法:需要定义4个位置指针
- f i r s t N o d e firstNode firstNode指向要交换的第一个节点
- s e c o n d N o d e secondNode secondNode指向要交换的第二个节点
- p r e pre pre指向 f i r s t N o d e firstNode firstNode的前一个节点
- n e x t next next指向 s e c o n d N o d e secondNode secondNode的后一个节点
如图所示,我们令
- s e c o n d N o d e . n e x t secondNode.next secondNode.next指向 f i r s t N o d e firstNode firstNode
- f i r s t N o d e . n e x t firstNode.next firstNode.next指向 n e x t next next
- p r e . n e x t pre.next pre.next指向 s e c o n d N o d e secondNode secondNode
这边完成了一次交换,之后令 p r e pre pre指向 f i r s t N o d e firstNode firstNode进行下一轮的交换
Java
/**
* 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 virtualHead = new ListNode(0);
virtualHead.next = head;
ListNode pre = virtualHead;
while (pre.next != null && pre.next.next != null) {
ListNode firstNode = pre.next;
ListNode secondNode = pre.next.next;
ListNode next = secondNode.next;
secondNode.next = firstNode;
firstNode.next = next;
pre.next = secondNode;
pre = firstNode;
}
return virtualHead.next;
}
}