题目描述:旋转列表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
这题直接纪念,一个思想,代码流程为:用k=k%L对链表长度求余,求出的值才是有效的旋转。
再定义两个指针,让一个指针p先走k步,再让两个指针同时走,当p->next=null时,q->next就为新链表的头节点。这个想法值得思考思考。
/**
* Definition for singly-linked list.
* 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* cur=head;
int n=0;
while(cur){
++n;
cur=cur->next;
}
k=k%n;
ListNode* p=head,*q=head;
for(int i=0;i<k;i++)
p=p->next;
while(p->next){
p=p->next;
q=q->next;
}
p->next=head;
p=q->next;
q->next=NULL;
return p;
}
};
题目描述:删除链表的倒数第N个节点
这题的思想只要明白上题描述,就容易理解了,代码如下。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* first=head;
while(n--!=0)
first=first->next;
if(first==NULL)
return head->next;
ListNode* sec=head;
while(first->next!=NULL){
sec=sec->next;
first=first->next;
}
sec->next=sec->next->next;
return head;
}
};