给你一个链表,交换每两个相邻的节点,并返回它的头部。
你的算法需要使用常量的空间,不可以交换链表中的元素,只有节点本身可以被改变。
1. 增设头节点,用来指向每次交换完两个指针后断开的链。
public ListNode swapPairs(ListNode head)
{
ListNode header = new ListNode(0); // 增设新链表的头结点
header.next = head; // 头指针指向第一个节点
ListNode p = head; // 指向第一个节点
ListNode q, t;
// 链表为空或链表只有一个元素时
if (head == null || head.next == null)
{
return header.next;
}
t = header;
while (p != null)
{
// 改变前两个节点的指针指向
q = p.next;
if (q != null)
{
p.next = q.next;
q.next = p;
// 使头指针指向新的首源节点
t.next = q;
t = p;
}
p = p.next;
}
return header.next;
}
如果允许交换元素的话,还可以这样做。
public ListNode swapPairs(ListNode head)
{
ListNode p = head;
ListNode q = null;
int tmp = 0;
// 如果链表为空
if (head == null || head.next == null)
{
return head;
}
while (p.next != null)
{
q = p.next;
// 交互相邻节点的值
tmp = p.val;
p.val = q.val;
q.val = tmp;
// 移动到下下一个位置
if (q.next == null)
break;
p = q.next;
}
return head;
}