LeetCode刷题----链表

链表基础知识

图示:
val:数据域 next:指针域1

代码对应图示

代码:

#include <stdio.h>

struct ListNode {
	int val;      //存储元素的数据域
	ListNode *next;
};    //存储下一节点地址的指针域

int main(){
	ListNode a;
	ListNode b;
	ListNode c;
	ListNode d;
	ListNode e;
	a.val = 10;
	b.val = 20;
	c.val = 30;
	d.val = 40;
	e.val = 50;
	a.next = &b;  //------1-----
	b.next = &c;
	c.next = &d;
	d.next = &e;
	e.next=NULL;  //----2-------
	ListNode $head = &a;
	while(head){
		printf("%d\n",heas->val)
		head = head->next;  //-----3------
	}
	return 0;
}

8道经典链表常考题目-----LeetCode

链表逆序(easy)-----206

已知链表头节点指针head,将链表逆序。(不可申请额外空间)

图示:
在这里插入图片描述
在这里插入图片描述代码:

struct ListNode {
	int val;      //存储元素的数据域
	ListNode *next;//指针域
	ListNode(int x) : val(x), next(NULL) {}
};    //构造函数

class Solution{
public:       //链表头节点指针
	ListNode* reverseList(ListNode* head){
	}          //返回链表逆序后的头节点指针
};

思路:
在这里插入图片描述在这里插入图片描述

代码:

class Solution{
public:       //链表头节点指针
	ListNode* reverseList(ListNode* head){
	ListNode *new_head = NULL;//指向新链表头节点的指针
	while(head){
		ListNode *next = head->next;//备份head->next-----1-----
		head->next = new_head;//更新head=>next-----2-----
		new_head = head;//移动new_head----3-----
		head = next;//遍历链表
	}
	return new_head;//返回新链表头节点
	}          //返回链表逆序后的头节点指针
};

测试:

int main(){
	ListNode a;
	ListNode b;
	ListNode c;
	ListNode d;
	ListNode e;
	a.next = &b;
	b.next = &c;//将节点简单的链接,进行测试
	c.next = &d;//无需构造复杂的操作(插入,删除)
	d.next = &e;
	Solution solve;
	ListNode *head = &a;
	printf("Before reverse:\n");
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}
	head = solve.reverseList(&a);
	prtinf("After reverse:\n");
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}
	return 0;
}
	

在这里插入图片描述

链表逆序2(medium)-----92

已知链表头节点指针head,将链表从位置m到n逆序。(不申请额外空间)

图示:
在这里插入图片描述代码:

class Solution{
public:
	ListNode* reverseBetween(ListNode* head, int m, int n){
	}
};

思路:
在这里插入图片描述在这里插入图片描述思考:
1.最终结果应该返回哪个节点?

2.如果m=1时,有什么特殊的?

代码:

class Solution{
public:
	ListNode* reverseBetween(ListNode* head,int m,int n){
		int change_len =n - m + 1;//计算需要逆置的节点个数
		ListNode *pre_head = NULL;//初始化开始逆置的节点的前驱
		ListNode *result = head;//最终转换后的链表头节点,非特殊情况即为head
		while(head && ==m){     //将head向前移动m-1个位置
		//-------1-------
			head = head->next;
		}						//将modify_list_tail指向当前的head,即逆置后的链表尾
		ListNode *modify_list_tail = head;
		ListNode *new_heaad = NULL;
		while(head && change_len){//逆置change——len个节点
			ListNode *next = head->next;
			head->next = new_head;
			new_head = head;
			head = next;
			//-------2-----
		}
			//-----3------
		if (pre_head){             //如果pro——head不变,说明不是从第一个结点开始逆置的m》1
		//-----4------
		}
		else{
		//--------5-----
		}
		return result;
	}
};

链表求交点(easy)

链表求环(medium)

链表划分(medium)

复杂链表的复制(hard)

2个排序链表归并(easy)

k个排序链表归并(hard)

解题方法,代码实现

一些学习与找工作建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KryHan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值