码迷,mamicode.com
首页 > 其他好文 > 详细

链表-Reverse Linked List II

时间:2016-03-10 23:44:03      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

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

这道题的一个关键在于,当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

标签:

原文地址:http://www.cnblogs.com/summerkiki/p/5263828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!