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.
Subscribe to see which companies asked this question
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
Solution:
1、使用前向指针
public ListNode SwapPairs(ListNode head)
{
if (head == null||head.next==null)
return head;
ListNode current = head;
ListNode next = current.next;
ListNode result = next;
ListNode pre = null;
while (next != null && current != null)
{
if (pre != null)
pre.next = next;
current.next = next.next;
next.next = current;
pre = current;
current = current.next;
if (current != null)
next = current.next;
}
return result;
}
2、使用"0"指针
public ListNode SwapPairs(ListNode head)
{
ListNode pre = new ListNode(0);
pre.next = head;
ListNode current=pre;
ListNode first = null,sec = null;
while (current.next != null && current.next.next != null)
{
first = current.next;
sec = first.next;
first.next = sec.next;
sec.next = first;
current.next = sec;
current = sec.next;
}
return pre.next;
}
public static ListNode SwapPairs(ListNode head)
{
ListNode current = head;
if (head != null && head.next != null)
{
current = head.next;
head.next = SwapPairs(current.next);
current.next = head;
}
return current;
}
效果同2