标签:
【题目要求直接翻转链表,而非申请新的空间】
这道题的一个关键在于,当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; }
标签:
原文地址:http://www.cnblogs.com/summerkiki/p/5263828.html