题目描述:
标签:链表 双指针
给你一个链表的头节点
head,旋转链表,将链表每个节点向右移动k个位置。
代码:
思路分析:
1、首先要有链表环的思想,如果移动的k是链表长度n的倍数,则说明没有移动保持原样,所以这里要有对k%n取余的思想。当形成链表环之后,要找到链表的最后一个节点是哪个,然后在该节点处断开即可。
2、处理特殊情况,链表为空或者链表长度为1,都返回原链表即可
3、统计链表长度,这里要注意因为要将最后一个节点与链表头连接在一起,所以不能用cur==null来作为循环结束条件,cur.next==null来判断,保证跳出循环时,当前指针cur指向最后一个节点
4、找到断开节点的位置是n-k%n,如果k是n的倍数,则直接返回add
5、将链表连成环形,cur.next=head
6、重新循环,将cur指针移动到断开节点处,并cur.next就是链表头,并将cur.next=null
7、返回head即可
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(k == 0 || head == null || head.next == null){
return head;
}
int n = 1;
ListNode cur = head;
while(cur.next != null){
cur = cur.next;
n++;
}
int add = n - k % n;
if(add == n){
return head;
}
cur.next = head;
while(add-- > 0){
cur = cur.next;
}
head = cur.next;
cur.next = null;
return head;
}
}
本文详细介绍了如何通过双指针技术实现链表旋转,包括处理特殊情况、统计链表长度以及形成环形链表的过程。核心思想是找到断开节点并将其与头部相连,最后重新调整链表结构。代码实现清晰,适用于理解链表操作和算法设计。
181

被折叠的 条评论
为什么被折叠?



