[leetcode]61. Rotate List反转链表k个节点

类似于找链表的后k个节点

不同的是要把前边的接到后边

public ListNode rotateRight(ListNode head, int k) {
        //特殊情况
        if (head==null||head.next==null||k==0) return head;
        int len = 0;
        ListNode p = head;
        //计算链表长度,防止k大于长度
        while (p!=null)
        {
            len++;
            p = p.next;
        }
        //k大于等于len的情况
        k = k>=len?k%len:k;
        if (k==0) return head;
        //下边是链表取后k个节点的方法,重要,双指针
        p = head;
        while (k-->0)
        {
            p = p.next;
        }
        ListNode q = head;
        while (p.next!=null)
        {
            p = p.next;
            q = q.next;
        }
        //找到目标节点开始位置
        ListNode res = q.next;
        //将原链表断开位置的后边置为null
        q.next=null;
        //将前边的链表接上
        ListNode temp = res;
        while (temp.next!=null)
        {
            temp = temp.next;
        }
        temp.next = head;
        return res;
    }

  

原文地址:https://www.cnblogs.com/stAr-1/p/8419572.html

时间: 2024-11-05 20:30:58

[leetcode]61. Rotate List反转链表k个节点的相关文章

[LeetCode] 61. Rotate List 旋转链表

Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanation: rotate 1 steps to the right: 5->1->2->3-&g

leetCode 61.Rotate List (旋转链表) 解题思路和方法

Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 思路:题目很清晰,思路是先得到链表长度,再从头开始直到特定点,开始变换连接即可. 代码如下: /** * D

LeetCode --- 61. Rotate List

题目链接:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 这道题的要求是向右旋转链表k步. 其实就是把链表后面l-k个节点放到前面,可以采用快慢指针处理.不

leetcode 61 Rotate List ----- java

Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k = 2,return 4->5->1->2->3->NULL.题目意思不难,就是说给一个数k,然后从右向左数第k个节点,然后以这个节点为开头,重新组成一个链表. 需要注意的就是如果k大于链表长度len

剑指offer和leetcode都有的_反转链表

输入一个链表,反转链表后,输出链表的所有元素. 一开始我的做法非常复杂,因为我一次变了两个指针,导致要分别判断单数个结点和偶数个结点的情况. 反转链表要解决的两个问题就是 1.结点指向它的前驱 2.头结点变为其尾结点 当反转一个结点时,假设反转i,首先需要记录它的前驱,让它指向它的前驱,还需要记录它的后继结点,否则就会造成链表的断裂,所以至少需要三个结点. 后来我整理了一下思路,发现有两种方法,一种用的是循环,一种用的是递归. 1.循环做法 /**循环做法来反转链表 * 思路是用三个指针来记录,

LeetCode Reverse Nodes in k-Group 每k个节点为一组,反置链表

题意:给一个单链表,每k个节点就将这k个节点反置,若节点数不是k的倍数,则后面不够k个的这一小段链表不必反置. 思路:递归法.每次递归就将k个节点反置,将k个之后的链表头递归下去解决.利用原来的函数接口即可,不用重新定义. 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NUL

LeetCode 面试题24. 反转链表

题目链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/ 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 1 /** 2 * Definition for singly-linked list.

小代码 反转单链表和 反转前K个节点的单链表

 /********************       WZ  ASUST  2016 代码与反思    ********************/ #include<iostream> #include<assert.h> #include<vector>//容器--类模板 #include<stdlib.h>//利用随机值 #include<time.h> using namespace std;   #define N 1000  #de

C++链表K个节点K个节点的反转((1,2,3,4),如果k是2,反转结果是(2,1,4,3))

#include <iostream> using namespace std; struct Node { int val; struct Node *next; Node(int x = int()):val(x),next(NULL){} }; struct List { List() { head=NULL; } void Insert(int x) { if(head==NULL) { head = new Node(x); } else { Node *p = head; Node