欢迎来到我的:世界
该文章收入栏目:链表
希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !
目录
前言
对于我来说这个博客是一个学习的地方,就像我的上篇文章一样,有老铁们的支持,陪伴;我很满足,这个栏目我会继续坚持下去,108回,就像我的108难一样,只要撑过磨难,一定能取到真经;
--------------------------对过程全力以赴,对结果淡然处之
第一题:反转一个链表
地址:oj地址
解题思路:
这里需要注意一下:如果按照头插入newnode,如果指针pHead将结点插入来的话,那pHead原指向的下一个结点就丢失了,所以这里需要创造一个新的指针 next 存放pHead所指的下一个结点,这样才能找回去;
代码:
struct ListNode* ReverseList(struct ListNode* head ) {
// write code here
struct ListNode* newnode = NULL;
struct ListNode* cur = head;
//头插
while (cur) {
//为了cur能够找回下一个结点
struct ListNode* next = cur->next;
//头插
cur->next = newnode;
newnode = cur;
//cur指针找回到下一个结点
cur = next;
}
return newnode;
}
第二题:链表内指定区间反转
地址:oj地址
这里来举两个测试用例
最后进行链接起来,让prve->next 指向newnode ,ret->next指向cur,最后返回head;
代码实现:
#include <math.h>
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
// write code here
if (head == NULL || head->next == NULL || m == n)
return head;
struct ListNode* cur = head;
struct ListNode* newnode = NULL, * tail = NULL;
newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
newnode->next = tail = NULL;
//找到m的最后一个
int count=m;
struct ListNode*prev=NULL;
while(count-->1)
{
prev=cur;
cur=cur->next;
}
struct ListNode*ret=cur;
//进行头插反转
int len=n-m+1;
while(len--)
{
struct ListNode*next=cur->next;
cur->next=newnode->next;
newnode->next=cur;
cur=next;
}
//链接
if(prev==NULL)
{
head=newnode->next;
ret->next=cur;
}
else {
prev->next=newnode->next;
ret->next=cur;
}
return head;
}
第三题:判断一个链表是否为回文结构
地址:oj地址
- 首先我们要知道什么是回文结构:
- 如
解题思路:
代码:
struct ListNode* middleNode(struct ListNode* head) {
// write code here
//返回中间结点的地址
//设置快慢指针
struct ListNode* sur = head, * dst = head;
//当dst指针为空或dst指向的next为空就停下
while (dst && dst->next) {
sur = sur->next;
dst = dst->next->next;
}
return sur;
}
//反转一串链表并返回该链表的头地址
struct ListNode* ReverseList(struct ListNode* head ) {
// write code here
struct ListNode* newnode=NULL;
struct ListNode* cur = head;
while (cur) {
struct ListNode* next = cur->next;
//头插
cur->next = newnode;
newnode = cur;
cur = next;
}
return newnode;
}
//实现判断是否为回文结构
bool isPail(struct ListNode* head ) {
// write code here
struct ListNode* mid = middleNode(head);
struct ListNode* rever = ReverseList(mid);
while (rever) {
if (head->val != rever->val) {
return false;
}
rever = rever->next;
head = head->next;
}
return true;
}
总结
对每到题,可能还是可以优化的,如果还有更好的方法的老铁,可以在评论区里面一起进行讨论哦,在后面随着小孩的知识储备越多,小孩肯定还会加以优化优化!!
到了最后:感谢支持
我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的