旋转链表(力扣61.)
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置
思考:
旋转链表的方式可以看作是一个圆环在旋转,那么就可以先让链表成环,以便于操作。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k){
if(head == NULL || head -> next == NULL) {
return head;
}
int cnt = 1;//cnt记录节点数
struct ListNode* p = head,* q = head;
while(q != NULL && q -> next != NULL) {
q = q -> next ;
cnt++;
}
q -> next = p;//先让链表成环
int n = k % cnt;
int step = cnt - n - 1;//走(cnt-n)步找到头,走(cnt-n-1)步找到尾
while(step > 0) { //让p往后走,找到断环处
p = p -> next;
step--;
}
struct ListNode* ans = p -> next;//ans记录最终返回的头节点
p -> next = NULL;//把环断开
return ans;
}
分隔链表(力扣86.):
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
思考:
分别组建两个链表smallhead和largehead,把大于或等于x的节点放到largehead,小于x的节点就放进smallhead中,最后把large的next指向NULL,然后链接两个链表
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* smallhead = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* small = smallhead;
struct ListNode* largehead = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* large = largehead;
while(head != NULL) {
if(head -> val < x) {
small -> next = head;
small = small -> next;
} else {
large -> next = head;
large = large -> next;
}
head = head -> next;
}
large -> next = NULL;
small -> next = largehead -> next;
return smallhead -> next;
}
版权声明:本文为zdsey原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。