题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路
定义一个 swap(p, q)
函数,不断的将 p
到 q
的子链逆序即可,题目关键要注意的链表指针的问题,在 java
传参中,对象传递的是引用,假如直接修改这个参数对象,将直接影响调用方的这个参数,但是如果改变了这个参数对象的地址,则相当于拷贝,不影响调用方,这个地方需要特别注意;
代码
/**
* Definition for singly-linked list.
*/
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode swap(ListNode p, ListNode q){
ListNode r = p.next, t = r;
p.next = q.next;
q.next = null;
q = r;
while (q != null){
r = q;
q = q.next;
r.next = p.next;
p.next = r;
}
return t;
}
public ListNode swapPairs(ListNode head) {
ListNode root = new ListNode(0), p = root, q = head;
root.next = head;
int cnt = 0;
while (q != null){
cnt++;
if (cnt%2 == 0){
q = swap(p, q);
p = q;
}
q = q.next;
}
return root.next;
}
}