61:Rotate List(旋转链表)【链表】【两指针】

题目链接:https://leetcode.com/problems/rotate-list/

/* 题意:给出一个链表,将链表向右旋转k个位置 */

/**
 *思路:右旋k个位置,相当与将链表从第len-k个位置截断,然后
 *     将两截链表交换位置,重新链接成一个链表
 *
 */
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head == NULL) return head; //空表,直接返回

        ListNode *end;
        int len = GetLength(head, &end);

        k %= len; 

        if(k == 0) return head;
        else {
            //
            int pre = len-k;
            ListNode *root = new ListNode(0);
            root->next = head;
            ListNode *curr = head;

            int index = 1;
            while(index != pre) {
                index ++;
                curr = curr->next;
            }
            //此时curr指向前半截链表的最后一个元素
            //也即旋转链表后的最后一个元素
            end->next = root->next;
            root->next = curr->next;
            curr->next = NULL;
            return root->next;
        }

    }
    //返回链表长度
    //end指向链表的最后一个结点
    int GetLength(ListNode *head, ListNode **end) {
        int len = 0;
        while(head != NULL) {
            len ++;
            *end = head;
            head = head->next;
        }
        return len;
    }
};
时间: 2024-10-04 21:19:56

61:Rotate List(旋转链表)【链表】【两指针】的相关文章

[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] 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. 这道旋转链表的题和之前那道Rotate Array 旋转数组 很类似,但是比那道要难一些,因为链表的值不能通过下表来访问,只能一个一个的

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

循环链表(4) - 分割链表为两段

下面例子演示了如何分割一个链表.使用代码对其进行实现. 原始的循环链表 分割后的循环子链表1 分割后的循环子链表2 1) 使用步进分别为1和2的算法,求得链表的中间指针以及尾指针: 2) 将后半部分链表形成循环链表: 3) 将前半部分链表形成循环链表: 4) 设置两个循环链表的头指针. 在下面的实现中,如果链表中节点个数为奇数,则前半部分链表的个数会比后半部分链表的个数多1. 代码实现: #include <iostream> //链表节点 struct Node { int data; No

基于十字链表的两个稀疏矩阵相乘

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int DataType;// 稀疏矩阵的十字链表存储表示 typedef struct LNode { int i,j; // 该非零元的行和列下标 DataType e; // 非零元素值 struct LNode *right,*down; // 该非零元所在行表和列表的后继链域 }LNode, *Link; typedef str

【LeetCode-面试算法经典-Java实现】【061-Rotate List(旋转单链表)】

[061-Rotate List(旋转单链表)] [LeetCode-面试算法经典-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. 题目大

sort-list——链表、快慢指针找中间、归并排序

Sort a linked list in O(n log n) time using constant space complexity. 链表,快慢指针找中点,归并排序. 注意判断条件fast->next!=NULL&&fast->next->next!=NULL,若为fast!=NULL&&fast->next!=NULL则会出现内存溢出 1 /** 2 * Definition for singly-linked list. 3 * stru

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

#include <iostream> #include <string.h> #include <stdlib.h> #include <stack> using namespace std; struct Node { int data; struct Node* next; }; struct Node* create_list(int len) { if (len <= 0) return NULL; struct Node* head; st

用链表实现两个数相加

说明:使用链表实现两个数的和,数的高位存储在链表的头部,最后输出结果.注:使用了翻转链表的功能. #include<stdio.h> #include<stdlib.h> struct Node { int value; Node *next; }; Node *reverseList(Node *head) { Node *pCur=head; Node *pPre=NULL; Node *rHead=NULL; while(pCur!=NULL) { Node *pNext=p