力扣刷题(链表篇)

题目讲解:

力扣

题号206,反转链表(简单)
题号61,旋转链表(中等)

第一题 (题号206)

题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

难点罗列

  • 如何把指针的方向改变
  • 如何依次循环

代码实现(先看总体,下面会解释)

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode*newhead = NULL;
    struct ListNode*tmp;
    while(head)
    {
        tmp = head-> next;
        head->next = newhead;
        newhead = head;
        head = tmp;
    }
    return newhead;

原来的样子
我们需要两个指针
在这里插入图片描述

经过一次循环后
在这里插入图片描述

经过两次循环后
在这里插入图片描述

解释每一个指针的作用

  • newhead -----------> 目的在于保存上一个的地址
  • cur ------------------->目的在于让链表的指向改变
  • tmp ------------------>目的在于保存下一个地址

第二题(题号61)

题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

难点罗列

  • 如何旋转
  • 如何形成一个新的列表

代码实现

struct ListNode* rotateRight(struct ListNode* head, int k) {
    if(head == NULL) return NULL;
    struct ListNode* tmp = head;
    int i = 1;
    while(head->next)
    {
        i++;
        head = head->next;
    }
    head->next = tmp;
    k = k%i ;
    for(int j =0 ;j<i-k;j++)//目的是找到结尾
    {
        head = head ->next;
    }
    tmp = head->next;
    head ->next =NULL;
    return tmp;

}

如何旋转
解决方法在于:将单链表短暂变成循环列表

在这里插入图片描述
在这里插入图片描述
这一步的代码实现如下

  struct ListNode* tmp = head;
    int i = 1;
    while(head->next)
    {
        i++;
        head = head->next;
    }
    head->next = tmp;

这里的 i 变量进行长度的统计,便于下一步的旋转

接下来,需要进行一定的数学分析,k 与长度 i 的关系
发现随着 k 的长度的增大,结果会以 i 为周期的一个变化

然后我们接下里的目的是找到,循环链表需要输出的表尾,然后在这里断开,返回表头

代码实现如下

	k = k%i ;
    for(int j =0 ;j<i-k;j++)//目的是找到结尾
    {
        head = head ->next;
    }
    tmp = head->next;
    head ->next =NULL;
    return tmp;

今天题目讲解就到这了,诸位早睡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值