将元素后移k个位置(王道链表第14题)

目录

题目

核心代码

完整代码

示例


题目

设将n(n>1)个整数存放到不带头结点的单链表L中,设计算法将L中保存的序列循环右移动k(0<k<n)个位置。例如,若k=1,则将链表{0,1,2,3}变为{3,0,1,2}。

核心代码

//向右移动k位
Node* Converse(Node **L,int k){
    int n=1;
    Node *p=*L;
    while(p->next!=NULL){
       p=p->next;
       n++;
    }
    p->next=*L;
    for(int i=0;i<n-k;i++){
        p=p->next;
    }
    *L=p->next;
    p->next=NULL;
    return *L;
}

完整代码

//不带头结点,并且向右移动k位
#include<stdio.h>
#include<stdlib.h>
//定义链表节点
typedef struct Node
{
   int data;
   struct Node* next;
}Node;

//创建新节点
Node* createNode(int data){
    Node* newNode=(Node *)malloc(sizeof(Node));
    newNode->data=data;
    newNode->next=NULL;
    return newNode;
}

//插入节点到链表的末尾
void insert(Node **L,int data){
    Node* newNode=createNode(data);
    if(*L==NULL){
        *L=newNode;
        return;
    }
    Node* temp=*L;
    while(temp->next!=NULL){
        temp=temp->next;
    }
    temp->next=newNode;
}

//向右移动k位
Node* Converse(Node **L,int k){
    int n=1;
    Node *p=*L;
    while(p->next!=NULL){
       p=p->next;
       n++;
    }
    p->next=*L;
    for(int i=0;i<n-k;i++){
        p=p->next;
    }
    *L=p->next;
    p->next=NULL;
    return *L;
}

//打印链表
void printList(Node* node){
    while(node!=NULL){
        printf("Data:%d\n",node->data);
        node=node->next;
    }
}
int main(){
    Node* L=NULL;

    insert(&L,1);
    insert(&L,2);
    insert(&L,3);
    insert(&L,4);

    printf("初始链表:\n");
    printList(L);

    Converse(&L,2);
    printf("变化后的链表:\n");
    printList(L);
    return 0;
}

示例

初始链表:
Data:1
Data:2
Data:3
Data:4
变化后的链表:
Data:3
Data:4
Data:1
Data:2

在Python中,交换链表中前后第K个元素是一个涉及到链表操作的问。在进行这个操作之前,需要明确链表的结构,以及K值的有效性。假设我们有一个单向链表,我们将按照以下步骤进行操作: 1. 首先,我们需要遍历链表找到第K个节点。 2. 然后,我们需要找到第K个节点之后的第K个节点(即倒数第K个节点)。 3. 接着,我们需要交换这两个节点的位置。 这里提供一个简单的Python代码示例来说明如何交换链表中前后第K个元素: ```python class ListNode: def __init__(self, value=0, next=None): self.value = value self.next = next def swapNodes(head, k): # Step 1: Find the kth node from the beginning kth_node = head for i in range(k - 1): if not kth_node: return None # K is larger than the length of the list kth_node = kth_node.next # Step 2: Find the kth node from the end kth_from_end = head for i in range(k): if not kth_from_end: return None # K is larger than the length of the list kth_from_end = kth_from_end.next # If kth_from_end is None, k is invalid or list is shorter than k if kth_from_end is None: return None # Step 3: Swap the values of kth_node and kth_from_end kth_node.value, kth_from_end.value = kth_from_end.value, kth_node.value return head # Helper function to print the list def printList(head): current = head while current: print(current.value, end=" ") current = current.next print() # Example usage: # Create the linked list 1->2->3->4->5 head = ListNode(1) head.next = ListNode(2) head.next.next = ListNode(3) head.next.next.next = ListNode(4) head.next.next.next.next = ListNode(5) print("Original list:") printList(head) # Swap the 2nd and 4th nodes head = swapNodes(head, 2) print("List after swapping:") printList(head) ``` 在上述代码中,我们定义了一个`ListNode`类来表示链表节点,并提供了`swapNodes`函数来交换链表中前后第K个元素。我们还定义了一个`printList`函数来打印链表的内容,以便于验证我们的交换操作是否成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值