leetcode.143. 重排链表.详解笔记.

该文描述了一个链表操作问题,通过三步解决:1)找到链表中间结点;2)反转后半部分链表;3)将反转后的后半部分逐个插入到前半部分中,每插入一个节点,前半部分的指针后移。关键在于正确处理链表指针的移动和连接。
摘要由CSDN通过智能技术生成

思路:

题目要求从链表尾部开始,逐个插入头部结点之中(每隔一个) ,相当于三个小题的拼接:找到链表中间结点,反转链表,插入结点。

前两个小题在之前的做题过程中已经解决,直接把这两题的代码拿来用就可以。只需解决第三个问题,设置两个指针分别遍历两个链表,循环条件为p2不空,因为我们是要把后半部分逐个插入前半部分,所以只判断p2即可,p2不空前半部分必不空。设置r指针记录p2后继,循环插入。插入一个结点后,p1指针后移,注意此时不是p1=p1->next而是p1=p2->next,因为此时p1后继为p2,需要再往后走一步才是下一个要插入位置的前驱。

tips:注意前半部分链表要断开,不然报错。

/**
 * 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* reverseList(ListNode* head){//反转链表 
	    if(!head) return NULL;
	    ListNode*cur=head,*pre=NULL;
	    while(cur){
		ListNode*temp=cur->next;
		cur->next=pre;pre=cur;cur=temp;
	    }
	    return pre;
    }
    ListNode* endFirstHalf(ListNode* head){//找到中间结点 
	    ListNode*fast=head,*slow=head;
	    while(fast->next!=NULL && fast->next->next!=NULL){
		fast=fast->next->next;
		slow=slow->next;
	    }
	    return slow;
    }
    void reorderList(ListNode* head) {
        ListNode*firsthalf=endFirstHalf(head);//找链表中间结点或前半部分最后一个结点
        ListNode*secondstart=reverseList(firsthalf->next);//反转后半部分
        firsthalf->next=nullptr;//前后断开
        ListNode*p1=head,*p2=secondstart;
        while(p2){//拼接
            ListNode*r=p2->next;//r指针记录p2后继
            p2->next=p1->next;p1->next=p2;
            p1=p2->next;p2=r;
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值