Reverse linked list(逆转从n到m处的单链表)--leetcode

12 篇文章 0 订阅
3 篇文章 0 订阅

题目描述:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

解题思路:
找到第m个结点,并记录其前继结点,然后依次从m+1开始到n,逆转后续结点,注意在最后的时候,修改原先第m处的链表的next指针。
代码如下:

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) {
        if (!head || m < 1 || m == n) return head;

        //前m-1个链表
        ListNode *q = NULL; //用q保存第m-1个结点
        ListNode *p = head; //让p指向第m个结点
        int count = 1;
        while(count < m && p){
            q = p;
            p = p->next;
            ++count;
        }

        //逆转m到n个结点
        ListNode *end = p;//始终指向逆转前的第m个结点
        ListNode *pre = p;//可以看为逆置链表的头结点
        ListNode *pNext = NULL;//指向p的下一个结点
        p = p->next;//(指向m+1处的结点)
        for (count = m+1; count <= n; ++count){
            pNext = p -> next;//保存下一个结点信息
            p -> next = pre;//头插法
            pre = p;//前移pre
            p = pNext;//回到初始链表的下一个结点
        }
        /* 结束的时候,end指向逆转前的第m个结点(逆转后,为逆转链表的最后一个结点),
           pre指向指向逆转后第m个结点(逆转前的第n个结点), p指向原链表的n+1个结点
        */
        //链接逆转链表和后面的链表
        end -> next = p;//这一步,修正了原链表第m个结点后项指针

        //如果第m-1个结点为空的话,表示,从head开始逆转
        if (q){//不为空,将前m-1个链表和逆转后的链表链接
            q -> next = pre;
        }else{//为空,逆转链表的头结点,就是要求的链表
            head = pre;
        }
        return head;
    }
};

配图分析:
分析

下面是使用C语言实现的单链表原地逆转的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void reverseList(struct Node** head) { struct Node* prev = NULL; struct Node* current = *head; struct Node* next = NULL; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } *head = prev; } void printList(struct Node* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } void push(struct Node** headRef, int newData) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newData; newNode->next = *headRef; *headRef = newNode; } int main() { struct Node* head = NULL; push(&head, 3); push(&head, 2); push(&head, 1); printf("Original list: "); printList(head); reverseList(&head); printf("Reversed list: "); printList(head); return 0; } ``` 在上述代码中,我们首先定义了一个 `Node` 结构体来表示单链表中的每个节点,包括节点的值和指向下一个节点的指针。然后我们定义了 `reverseList` 函数来实现原地逆转单链表的功能。该函数接受一个指向指针的指针 `head`,这是因为我们需要通过指针来修改单链表的头节点,所以我们传递指向指针的指针。在函数内部,我们使用三个指针 `prev`、`current` 和 `next` 来依次遍历单链表,并将每个节点的指针指向前一个节点,从而实现原地逆转单链表的目的。 最后,我们定义了一个 `push` 函数来添加新节点到单链表的头部,并定义了 `printList` 函数来打印单链表中所有节点的值。在 `main` 函数中,我们创建了一个包含三个节点的单链表,并调用 `reverseList` 函数来原地逆转单链表,最后打印出原始和逆转后的单链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值