SLinkedList slist = new SLinkedList();
slist.AppendRange(new[] { 1, 2, 3, 4, 5 });
Console.WriteLine("Input: " + slist.Print());
Console.WriteLine("k=2");
var rslt = slist.RotateRight(2);
Console.WriteLine(rslt.Print());
///
/// 向右旋转链表 k 次
///
///
///
///
///
public static SLinkedList RotateRight(this SLinkedList source, int k) where T : IComparable
{
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(source);
var head = tmp.Head;
var tmp2 = new SLinkedList(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();
for (int i = 0; i < len; i++)
{
res.Append(cur.Data);
cur = cur.Next;
}
return res;
}