[蓝蓝考研算法]-day14

58 阅读1分钟

19、删除排序链表中的重复元素

给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表

示例 1:

输入:head = [1,1,2] 输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3] 输出:[1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内

  • -100 <= Node.val <= 100

  • 题目数据保证链表已经按升序 排列

1、思路

遍历链表,遇到相同的删除

2、具体实现

#include<iostream>
#include<cstdio>
using namespace std;
//定义链表节点
typedef struct LNode
{
	int val;
	LNode* next;
	LNode(int val) :val(val), next(nullptr) {};
}*LinkList, LNode;
//创建链表
LinkList ListTailInsert(int n)
{
	LNode* dummyHead = new LNode(-1), * r = dummyHead, * s;
	int val;
	while (n-- && cin >> val)
	{
		s = new LNode(val);
		r->next = s;
		r = s;
	}
	return dummyHead;
}
//对链表数据域相同的节点进行去重操作
void DelDupNode(LinkList& L)
{
	LNode* cur = L, * tmp;	
	int val = cur->val;
	while (cur->next)
	{
	
		if (val == cur->next->val)
		{
			tmp = cur->next;
			cur->next = cur->next->next;
			delete tmp;
		}
		else
		{
			cur = cur->next;
			val = cur->val;
		}
	}
}

int main()
{
	LinkList L = ListTailInsert(3);
	DelDupNode(L);
	LNode* cur = L->next;
	cout << "去重后链表:";
	while (cur)
	{
		cout << cur->val << " ";
		cur = cur->next;
	}
	return 0;
}

20、[反转链表]

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

示例 1:

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2] 输出:[2,1]

示例 3:

输入:head = [] 输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]

  • -5000 <= Node.val <= 5000

1、思路

2、具体实现

#include<iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
    
};
class Solution
{
  public:
       ListNode * reverseList(ListNode * head) {
           ListNode* tmp;
           ListNode* cur = head;
           ListNode* pre = nullptr;
           while (cur) {
               tmp = cur->next; //暂存cur的下一个节点
               cur->next = pre; //翻转相邻的两个节点

               //更新pre和cur指针
               pre = cur;
               cur = tmp;
           }
           return pre; //返回反转后的头节点
       }
 };