24. 两两交换链表中的节点/25. k个一组翻转链表

版权声明:欢迎去我的新家https://www.jianshu.com/u/906a78709f1d https://blog.csdn.net/dongyanwen6036/article/details/85269505
24. 两两交换链表中的节点

要求: 你的算法只能使用常数的额外空间。(不能用栈)
分析[1]: 一般在处理链表问题时,我们大多时候都会在开头再加一个dummy node,因为翻转链表时头结点可能会变化,为了记录当前最新的头结点的位置而引入的dummy node ,此外本题循环判断后两个节点不为空的情况下,将后面这两个元素进行交换即可,最重要的是,交换的时候,要记得保留后面的链表数据,以便拼接起来链表,谨防数据丢失。

 class Solution {
 public:
	 ListNode* swapPairs(ListNode* head) {
		 if (head == nullptr)return nullptr;
		 ListNode * new_head = new ListNode(0);
		 new_head->next = head;
		 ListNode *p = new_head;
		 
		 while ( p->next&& p->next->next) 
		 {	 	
			 ListNode *p1 = p->next;			 
			 ListNode *p2 = p->next->next;
			 p->next = p2;
			 p1->next = p2->next;
			 p2->next = p1;
			 

			 p = p1;
		 }
		 
		 return new_head->next;

	 }
 };
25. k个一组翻转链表

分析:一个for循环走了k步(k条线)共k+1的节点,那么start指向1个节点,end指向是k+1个节点,那么只需每次翻转end之前的节点,递归每一个k段。

在这里插入图片描述

c++ leetcode Ac :





参考:
[1]https://cloud.tencent.com/developer/article/1142277
[2]http://wiki.jikexueyuan.com/project/leetcode-book/24.html

猜你喜欢

转载自blog.csdn.net/dongyanwen6036/article/details/85269505
今日推荐