Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
这道题我感觉最重要的点是在链表头再加一个临时结点,这样就不用去判断那些特殊情况了。Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode swapPairs(ListNode head) {
ListNode cur = head;
ListNode tmp = null,preHead=new ListNode(0);
preHead.next=head;
ListNode pre=preHead;
ListNode node1=null,node2=null;
while((node1=cur)!=null&&(node2=cur.next)!=null){
tmp = node2.next;
node2.next=node1;
node1.next=tmp;
pre.next=node2;
pre=node1;
cur=tmp;
}
return preHead.next;
}
}
go代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func swapPairs(head *ListNode) *ListNode {
preHead:=&ListNode{
Val:0,
Next:head,
}
var node1,node2,cur,tmp,pre *ListNode
cur=head
pre=preHead
for (cur!=nil)&&(cur.Next!=nil){
node1=cur
node2=cur.Next
tmp=node2.Next
node2.Next=node1
node1.Next=tmp
pre.Next=node2
pre=node1
cur=tmp
}
return preHead.Next
}