链表-Reverse Linked List II

Posted summerkiki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表-Reverse Linked List II相关的知识,希望对你有一定的参考价值。

技术分享

【题目要求直接翻转链表,而非申请新的空间】

这道题的一个关键在于,当m=1时,需要翻转的链表段前没有其他的结点(leetcode的测试用例不含头结点),这个特例给解题带来了一点小小的困难。一个比较直观、比较方便的想法是在链表中插入一个头结点,这样处理起来方便很多。除此之外,还要注意各种循环边界条件的设置。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
    struct ListNode * pre=(struct ListNode *)malloc(sizeof(struct ListNode));
    pre->next=head;
    head=pre;   //插入一个头结点
    struct ListNode * begin;
    int i=0;
    while(i<m-1)
    {
        pre=pre->next;
        i++;
    }
    begin=pre->next;
    for(i=m;i<n;i++)
    {
        struct ListNode *p=begin->next;
        begin->next=p->next;
        p->next=pre->next;
        pre->next=p;
    }
    
    return head->next;
    
}

在leetcode上看到一个很简洁的代码,基本思路大致相同灵活地运用了指针,无需添加头结点,膜拜!

ListNode* reverseBetween(ListNode* head, int m, int n) {
    ListNode **pre = &head;  //pre中存储head指针的地址
    int steps = m;
    while (--steps) { pre = &(*pre)->next;}
    ListNode *cur = *pre;  //指向翻转链表的第一个结点
    for (int i = m; i < n; i++) {
        ListNode *next_n = cur->next;
        cur->next = next_n->next;
        next_n->next = *pre;
        *pre = next_n;
    }
    return head; 
}

 

以上是关于链表-Reverse Linked List II的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]92. Reverse Linked List II反转部分链表

反转链表 Reverse Linked List II

[Leetcode] Reverse linked list ii 反转链表

LeetCode 92. Reverse Linked List II

Lintcode36 Reverse Linked List II solution 题解

leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)