链表-Reverse Linked List II

链表-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=;
while(i<m-)
{
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;
}
上一篇:gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解


下一篇:docker时间与系统时间同步的问题