题解 | #链表内指定区间反转#

链表内指定区间反转

http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

将链表分成三部分,区间左边的和区间右边的,再加上区间链表。写一个反转链表的函数,将区间的链表进行反转,然后拼接三个链表。这写的有点繁琐了

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    //反转链表
    ListNode* reverseList(ListNode* head)
    {
        if(!head) return NULL;
        ListNode* tmp = (ListNode*) malloc(sizeof(struct ListNode));
        ListNode* next = NULL;
        tmp->next = NULL;
        while(head)
        {
            next = head->next;
            head->next = tmp->next;
            tmp->next = head;
            head = next;
        }
        return tmp->next;
    }
    
    ListNode* reverseBetween(ListNode* head, int m, int n) 
    {
        if(m == n) return head;
        // write code here
        ListNode* begin = NULL, *end = NULL, *reverseHead = NULL, *reverseEnd = NULL;
        ListNode* tmp = head;
        int i = 1;
        while(tmp)
        {
            if(i == m)
                reverseHead = tmp;
            if(i == n)
            {
                reverseEnd = tmp;
                end = tmp->next;
                break;
            }
            tmp = tmp->next;
            i++;
        }
        i = 1;
        reverseEnd->next = NULL;  //断开链表
        reverseHead = reverseList(reverseHead); // 局部链表反转
        tmp = reverseHead;
        while(tmp->next)
             tmp = tmp->next;
        tmp->next = end;  //链接尾部链表
        if(m == 1) return reverseHead;
        tmp = head;
        while (tmp)
        {
            if(i == m-1)
            {
                begin = tmp;
                break;
            }
            tmp = tmp->next;
            i++;
        }
        begin->next = reverseHead;
        return head;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-19 16:50
点赞 评论 收藏
分享
白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务