1.双指针法
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode(-1,head),temp = pre;
while(temp.next != null && temp.next.next != null){
ListNode first = temp.next;
ListNode second = temp.next.next;
first.next = second.next;
second.next = first;
temp.next = second;
temp = first;
}
return pre.next;
}
}
2.栈
每次入栈两个节点,利用栈的先进后出将两元素反转组成子链表,最后把所有链表连接即可。注意要判断链表的长度是奇数还是偶数来决定在链表尾部添加null还是剩下的最后一个节点。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1,head),cur = dummy;
Stack<ListNode> st = new Stack<>();
while(head != null && head.next != null){
ListNode next = head.next.next;
st.push(head);
st.push(head.next);
ListNode popNode1 = st.pop();
ListNode popNode2 = st.pop();
popNode1.next = popNode2;
cur.next = popNode1;
head = next;
cur = popNode2;
}
if(head == null){//偶数
cur.next = null;
}else{//奇数
cur.next = head;
}
return dummy.next;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。