版权声明:欢迎去我的新家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