LeetCode---24. 两两交换链表中的节点

题目来源:https://leetcode-cn.com/problems/swap-nodes-in-pairs/description/

题目描述:

算法描述:该题目有两种方法解决,一种递归,一种非递归

非递归方法:

1.如果链表只有一个或者没有节点的话,直接返回head。

2.然后先交换第一个和第二个节点。(因为如果只有两个结点的话这是一种特殊情况,需要单独处理)

3.如果第一个结点和第二个节点交换完成以后,还有结点,就用循环进行交换。

代码如下:

struct ListNode* swapPairs(struct ListNode* head) {
	if(!head||!head->next) return head;//链表只有一个结点或没有节点时直接返回      
	struct ListNode* l=head;//定义需要交换的左右节点
	struct ListNode* r=l->next;        
	struct ListNode* p;        
	l->next=r->next;//交换第1个和第二个结点    
	r->next=l;
	head=r;//头指针挪到原来的第二个节点上(现在是第一个结点),完成前两个结点的交换      
	p=l;//p赋值为第一对交换成功的右节点 
	while(l->next&&l->next->next){//如果剩余节点为0或1则返回head,否则进入循环            
		l=l->next;//转换到下一节点对
		r=l->next;            
		l->next=r->next;//交换节点l,r            
		r->next=l;            
		p->next=r;           
		p=l;       
	}        
	return head;  
}

递归方法:

利用递归的思想,依次交换链表中的节点对。具体对于每个节点来说:

1.若该节点为NULL,则直接返回NULL

2.若该节点的下一个节点为NULL,则直接返回该节点

3.交换该节点与下一个节点,利用辅助指针记录该节点的下一个节点,并递归的交换接下来的节点对

该方法虽然比较简单,但由于是递归所以运行时间会比较长。

代码如下:

struct ListNode* swapPairs(struct ListNode* head) {
    if(!head) return NULL;
    if(!head->next) return head;
    struct ListNode* temp=head->next;
    head->next=swapPairs(temp->next);
    temp->next=head;
    return temp;
}

猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/82972198