一、61. 旋转链表
1.1问题描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
2.2思路
旋转链表这道题的思路主要是将链表构成环状链表(也就是最后一个节点指向头节点)按照环状链表移动完之后,将移动后的链表断开。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(k==0||head==nullptr||head->next==nullptr){
return head;
}
int n=1;
ListNode* iter=head;
while(iter->next!=nullptr){
iter=iter->next;
n++;
}
int add=n-k%n;//向右移动的次数等于链表长度 不移动
if(add==n){
return head;
}
iter->next=head;//尾节点指向头节点构造环形链表
while(add--){
iter=iter->next;//环形链表后,节点移动
}
//iter是尾节点
// 新的头结点指向断开环的位置
ListNode* ret=iter->next;
iter->next = nullptr;//尾节点指向空,环断开
return ret;
}
};
二、82. 删除排序链表中的重复元素 II
2.1问题描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
2.2 思路
指针类型题需要定义辅助指针进行移动,这里面需要找重复的节点也就是val是相同的,问题中可能连续出现相同的节点 所以需要定义一个临时的x判断是否同一个节点连续紧挨着出现。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head){
return head;
}
ListNode* dummy=new ListNode(0,head);
ListNode* cur=dummy;
while(cur->next&&cur->next->next){
if(cur->next->val==cur->next->next->val){
int x=cur->next->val;
while(cur->next&&cur->next->val==x){
cur->next=cur->next->next;
}
}else{
cur=cur->next;
}
}
return dummy->next;
}
};