4.27算法题

旋转链表(力扣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版权协议,转载请附上原文出处链接和本声明。