61. 旋转链表
题目:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
2->0->1->NULL
0->1->2->NULL
2->0->1->NULL
代码1:
思路:采用暴力法,并在此基础上根据t(可以看成计数器,判断是否走到尾时与k的关系)与k的关系,分成三种情况讨论
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode rotateRight(ListNode head, int k) { 13 //特殊情况特殊处理 14 if(head==null){return null;} 15 if(head.next==null){return head;} 16 17 ListNode p=head; //当链表长度大于k时,指向旧链表尾节点,当链表长度小于k时,指向新链表尾节点 18 ListNode pre=head; //当链表长度大于k时,新链表尾节点 19 ListNode tail=null; //指向旧链表尾节点 20 int t=0; 21 while(p.next!=null){ 22 p=p.next; 23 ++t; 24 if(p.next==null){tail=p;} //tail始终指向为节点 25 if(t>k){ //k小于链表长度 26 pre=pre.next; 27 }else if(p.next==null&&t==k){break;} 28 else{ //k比链表长度大 29 if(p.next==null){ 30 p=head; 31 ++t; 32 if(t==k){ 33 return head; 34 } 35 } 36 37 } 38 } 39 if(p.next==null){ //k小于链表长度情况 40 p.next=head; 41 head=pre.next; 42 pre.next=null; 43 } 44 else{//k大于链表长度情况 45 tail.next=head; 46 head=p.next; 47 p.next=null; 48 } 49 return head; 50 } 51 }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术