链表oj刷题——6道进阶题目

本文介绍了六道关于链表的算法题目,包括链表分割、回文结构判断、查找链表公共结点、判断环形链表、寻找链表环的入口以及复制带有随机指针的链表。通过详细思路解析,帮助读者掌握链表操作技巧。
摘要由CSDN通过智能技术生成

目录

1.链表分割

题目:

思路:

2.链表的回文结构

题目:

思路:

3. 输入两个链表,找出它们的第一个公共结点。

题目:

思路一:

思路二:

思路三:

4. 给定一个链表,判断链表中是否有环

题目:

思路:

5. 给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL

题目:

思路:

6. 给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点。

题目:

思路:


1.链表分割

题目:

链表分割_牛客题霸_牛客网

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

相对顺序不能变

5 3 2 8 1 6 x=4

3 2 1 5 8 6

思路:

1.定义两个链表

less

greater

lesshead和greaterhead是哨兵位的头结点

2.

比x小的尾插到less链表

比x大的尾插到great链表

3.

两个链接到一起,lesstail->next指向greaterhead->next

最后将两个lesshead和greaterhead释放掉

 

建议定义哨兵位,比较简单

分析极端场景

  1. 都比x小
  2. 都比x大
  3. 有大有小

注意:

第三种场景中可能会出现代还

代还,此时8还是指向1

解决方法:

greatertail->next = NULL;

 

 此方法是带哨兵位的头结点

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* greaterhead, *greatertail,*lesshead,*lesstail;//一次性定义四个指针
        
        greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode));
        lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));
       
        greatertail->next = NULL;
        lesstail->next = NULL;
        
        struct ListNode* cur = pHead;//pHead是现有链表的头指针
        while(cur)
        {
            //链表中小于x的数将被尾插进less链表中
            if(cur->val < x)
            {
                lesstail->next = cur;//尾插进去
                lesstail = lesstail->next;//更新lesstail
            }
            //比x大的数被尾插进great链表中
            else
            {
                greatertail->next = cur;
                greatertail = greatertail->next;
            }
            cur = cur->next;//更新cur
        }
        //链接两个链表
        lesstail->next = greaterhead->next;
          //解决代还现象
        greatertail->next = NULL;
        
        struct ListNode* head = lesshead->next;//定义头指针
        //将两个哨兵位释放掉
        free(greaterhead);
        free(lesshead);
        
        return head;//返回重新排列后的链表的头指针
    }
};

注意:

这道题在vs中想要调试的时候可能与其他题目调试有所不一样,因为代码中含有C++的代码,与C语言的语法有所差异,调试的时候就有可能编译不过去。

方法:

把struct加上,把它当成C语言的函数进行调试,可以把C++的部分去掉

2.链表的回文结构

题目:

 

链表的回文结构_牛客题霸_牛客网

1 2 2 1

1 2 3 2 1

就是看链表是否对称

思路:

之前写过数组判断回文的方法:

给定两个指针(下标也可),一个在左一个在右,往中间走。

但是单链表并不支持如此写法。

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值