Leetcode算法刷题笔记1-链表

Leetcode算法刷题笔记1-链表

  • Leetcode 206. 反转链表
  • Leetcode 92.反转链表II
  • 尾语

相关刷题笔记博客
竞赛常用模板整理(ACM/ICPC/CCSP)
Leetcode算法刷题笔记1-链表
Leetcode算法刷题笔记2-栈、队、堆
Leetcode算法刷题笔记3-递归与回溯
Leetcode算法刷题笔记4-贪心
Leetcode算法刷题笔记5-二叉树
Leetcode算法刷题笔记6-图
Leetcode算法刷题笔记7-动态规划
Leetcode算法刷题笔记8-二分查找

Leetcode 206. 反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list/

#include
struct ListNode {
      int val;  //当前结点的值
      ListNode *next;  //指向下一个结点的指针
      ListNode(int x) : val(x), next(NULL) {}  //初始化当前结点值为x,指针为空
  };
using namespace std;
class Solution{
	public:
		ListNode* reverseList(ListNode* head){
			ListNode *new_head = NULL;//指向新链表头节点指针 
			while(head){
				ListNode *next = head->next;//备份head->next 
				head->next = new_head;//更新head->next 
				new_head = head;//移动new_head 
				head = next;//遍历链表 
			}
			return new_head;//返回新链表表头头节点 
		}
};
int main(){
	ListNode a(1);
	ListNode b(2);
	ListNode c(3);
	ListNode d(4);
	ListNode e(5);
	a.next = &b;
	b.next = &c;
	c.next = &d;
	d.next = &e;
	Solution solve;
	ListNode *head = &a;
	while(head){
		cout<<head->val<<"->"; 
		head = head->next;
	}
	cout<<"NULL"<<endl;
	head = solve.reverseList(&a);
	cout<<"反转后"<<endl;
	while(head){
		cout<<head->val<<"->"; 
		head = head->next;
	}
	cout<<"NULL"<<endl;
	return 0;
}

Leetcode 92.反转链表II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

#include
struct ListNode {
      int val;  //当前结点的值
      ListNode *next;  //指向下一个结点的指针
      ListNode(int x) : val(x), next(NULL) {}  //初始化当前结点值为x,指针为空
  };
using namespace std;
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){
				pre_head = head;//将head向前移动m-1个位置 
				head = head->next;
			}
			ListNode *modify_list_tail = head;//用 modify_list_tail指向当前的head,即 逆置后的链表尾 
			ListNode *new_head = NULL;
			while(head && change_len){//逆置change_len个节点 
				ListNode *next = head->next;
				head->next = new_head;
				new_head = head;
				head = next;
				change_len--;
			}
			modify_list_tail->next = head;
			if(pre_head){               //若是pre_head不为空,则不是第一节点开始逆置的m>1 
				pre_head->next = new_head;
			}else{
				result = new_head;
			}
			return result;
		}
};
int main(){
	ListNode a(1);
	ListNode b(2);
	ListNode c(3);
	ListNode d(4);
	ListNode e(5);
	a.next = &b;
	b.next = &c;
	c.next = &d;
	d.next = &e;
	Solution solve;
	ListNode *head = solve.reverseBetween(&a,2,4);
	while(head){
		cout<<head->val<<endl;
		head = head->next;
	}
	return 0;
}

尾语

诚邀各校各地有志之士加入我们大学生IT学习群交流:871352155(请各位广告大佬高抬贵手,常讨论学习无关的朋友请出门右拐∑(っ°Д°;)っ)

你可能感兴趣的:(Leetcode算法刷题笔记,算法,c++,链表,单链表,数据结构)