61. Rotate List

向右旋转链表 k 次

int[] arr = new[] { 6, 1, 1, 2, 3, 3, 3, 4, 5, 5 };
SLinkedList<int> slist = new SLinkedList<int>();
slist.AppendRange(arr);
Console.WriteLine("Before: " + slist.Print());
var rslt = slist.RotateRight(3);
Console.WriteLine(" After: " + rslt.Print());

/// <summary>
/// 向右旋转链表 k 次
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="k"></param>
/// <returns></returns>
public static SLinkedList<T> RotateRight<T>(this SLinkedList<T> source, int k) where T : IComparable<T>
{
    if (source.Head == null || source.Head.Next == null || k == 0)
    {
        return source;
    }
    var len = source.Count;
    if (k % len == 0)
    {
        return source;
    }

    var tmp = new SLinkedList<T>(source);
    var head = tmp.Head;
    var tmp2 = new SLinkedList<T>(head);
    var newHead = tmp2.Head;
    var cur = newHead;
    while (cur.Next != null)
    {
        cur = cur.Next;
    }
    // 连接
    cur.Next = head;
    cur = newHead;
    for (int i = len - k % len; i > 0; i--)
    {
        cur = cur.Next;
    }
    var res = new SLinkedList<T>();
    for (int i = 0; i < len; i++)
    {
        res.Append(cur.Data);
        cur = cur.Next;
    }
    return res;
}
posted @ 2022-06-09 11:14  wesson2019  阅读(13)  评论(0编辑  收藏  举报