两两交换链表的节点
题目描述 给你一个链表,请你两两交换相邻节点,你需要真正交换节点本身,而不是修改节点的值。
方法一:直接法
解题思路
对于本题,采用直接法进行求解,即两两交换相邻节点即可。
解题代码
class Solution {
public:
ListNode* swapLinkedPair(ListNode* head)
{
if(head==nullptr||head->next==nullptr)
{
return head;
}
ListNode* p=head,*q=head->next,*t;//初始化
ListNode* h=q;
while(p&&q)
{//循环
t=q->next;//交换操作
q->next=p;
if(t&&t->next)
p->next=t->next;
else
p->next=t;
p=t;
if(t)
{
q=t->next;
}
}
return h;
}
};
复杂度分析
时间复杂度:一次遍历,因此时间复杂度为。
空间复杂度:使用常数级内存地址空间,因此空间复杂度为。
方法二:Java方法
解题思路
思路同方法一,使用Java编程。
解题代码
import java.util.*;
public class Solution {
public ListNode swapLinkedPair (ListNode head)
{
if(head==null||head.next==null)
{
return head;
}
ListNode p=head,q=head.next,t;//初始化
ListNode h=q;
while(p!=null&&q!=null)
{//循环
t=q.next;//交换操作
q.next=p;
if(t!=null&&t.next!=null)
p.next=t.next;
else
p.next=t;
p=t;
if(t!=null)
{
q=t.next;
}
}
return h;
}
}
复杂度分析
时间复杂度:一次遍历,因此时间复杂度为。
空间复杂度:使用常数级内存地址空间,因此空间复杂度为。