LeetCode | Rotate List(迴圈右移連結串列)
阿新 • • 發佈:2019-01-22
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>n的時候k = k%n。然後再進行,也就是要先遍歷一邊連結串列求出其長度。
有了連結串列以後,也不能直接找到n-k-1的結點,因為連結串列最後的指標還要指向頭結點。但網友有個辦法,遍歷連結串列時只遍歷到最後一個結點然後計算總長度。
先上自己的程式碼:
class Solution { public: ListNode *rotateRight(ListNode *head, int k) { if(head == NULL || k <= 0) return head; int n = 0; ListNode *p = head; while(p){ p = p->next; ++n; } if(k%n == 0) return head; k = k%n; //迴圈找 p = head; int i = 1; //找到第k個節點 while(p->next && i < k){ p = p->next; i++; } //這時候p一定不為NULL,因為k<n ListNode *q = head; p = p->next; while(p->next != NULL){ p = p->next; q = q->next; //p遍歷完以後,指向倒數第K+1個結點 } p->next = head; head = q->next; q->next = NULL; return head; } };
再看網友的程式碼:
class Solution { public: ListNode *rotateRight(ListNode *head, int k) { if(head==NULL)return NULL; ListNode *p=head; int n=0; while(p->next) { p=p->next; n++; } n++; k=k%n; p->next=head; //這裡就處理了尾指標 ListNode *q=head; for(int i=0;i<n-k-1;i++) q=q->next; head=q->next; q->next=NULL; return head; } };