赞
踩
题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例2:
输入:head = []
输出:[]
示例3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
c++代码(非递归):
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: //非递归解法 ListNode* swapPairs(ListNode* head) { if(head==nullptr||head->next==nullptr)return head; ListNode* newhead = new ListNode(-1,head); ListNode* temp = newhead; ListNode* newnext = newhead; ListNode* newbehind = head; while(temp->next!=nullptr&&temp->next->next!=nullptr){ newnext = temp->next; newbehind = temp->next->next; temp->next = newbehind; newnext->next = newbehind->next; //!让newnext的下一个指向和newbehind一样,保证后面部分的链表不变 newbehind->next = newnext; temp = newnext; } return newhead->next; } };
1.首先声明newhead作为虚头节点,指向head,用newhead->next记录变化后的head。再声明temp,初始化temp=newhead,用temp来遍历链表。
2.用temp遍历链表,当temp不满足其后面还有两个非空节点时,结束遍历;若满足,则执行交换操作:
【要两两交换,每次变化只涉及3个节点,当前节点a,和a后面两个要交换顺序的节点b和c(a->b->c变成a->c->b),下一轮变化时,让a等于b,再从这里开始新的交换】
首先用newnext记录要后移的节点,newbehind记录要前移的节点。如:1->2->3->4中,newnext为2,newbehind为1,newnext为4,newbehind为3。
然后更新节点间的next关系。
(1)更新temp->next,前移节点:temp->next = newbehind;
(2)更新newnext->next,使其指向原先newbehind后面的节点,如1->2->3->4中,newnext->next应该更新为指向3:newnext->next = newbehind->next;
(3)更新newbehind->next,后移节点:newbehind->next = newnext;
然后移动temp,开启下一轮的变化:temp = newnext
3.最后通过temp已经修改了链表,使得newhead后面指向的是新的链表,只需return newhead->next
c++代码(递归):
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: //递归解法 ListNode* swapPairs(ListNode* head) { //递归终止条件:当当前节点为空,或当前节点后面只有一个节点时不再执行变换操作,直接return if(head==nullptr||head->next==nullptr)return head; ListNode* nextnode = head->next; head->next = swapPairs(head->next->next); nextnode->next = head; return nextnode; } };
python代码(非递归):
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def swapPairs(self, head): if head == None or head.next == None: return head newhead = ListNode(-1,head) #新虚头节点 temp = newhead #用于遍历链表 while temp.next != None and temp.next.next != None: #当前节点后面两个要交换的节点 newnext = temp.next newbehind = newnext.next #执行交换 temp.next = newbehind newnext.next = newbehind.next newbehind.next = newnext #更新当前节点 temp = newnext #返回虚节点后面的第一个节点,即为修改后的链表的头节点 return newhead.next
(python里空是None,不是NULL)
(== None ,!= None 和 is None, is not None 都可以)
注意:
(1)a->x->y->b,交换两个节点x和y:让a指向y,让x指向b,再让y指向x。
(2)返回修改链表后的新头节点:先创建虚头节点newhead指向原链表头节点,再创建新的头节点temp(temp=head)用于遍历和修改链表中的节点,最后返回newhead->next即为修改后链表的头节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。