旋转链表 --java记录

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。在这里插入图片描述
思路: 首先链成环,找到作为头节点新节点,然后拆环

1、链表长度为n,将它设置成为一个环形链表,则节点移动n次后回到原来位子。k >=n 时候可以用 k = k%n 来判断需要移动的位子。
2、k 值 对应是 倒数第k个节点作为新得头节点。 (示例1,k = 2,则倒数第2个节点 4 作为新的头节点)。这个4节点的位子 为 n - k +1
3、将环形链表拆开,需要将新头节点前面的节点的next置空( 4是头节点 则3.next = null)
4、输出新头节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
	         
	        if(head == null || head.next == null || k == 0) return head;
	        ListNode node = head;
	        int n = 1;
	        while(node.next != null) {
	        	 
	        	node = node.next;
	        	n ++; 
	        }
	        ListNode tail = node; //记录尾节点
	        node = head;
	        ListNode prenode = head;
            if(k >= n){
                k = k % n;
            }
            if(k == 0 ) return head;
	        int index = n - k + 1;
	        
	        //找到index 处的节点 ,让他成为头节点
	        for(int i = 1; i < index; i++) {
	        	prenode = node;
	        	node = node.next;
	        }
	        tail.next = head;   //链成环
	        //将 node节点置为head,并把前节点指向null
	        prenode.next = null;
	        head = node;
	        return head;
	    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值