程序员代码面试指南第二版 23.将单链表的每K个节点之间逆序

welcome to my blog

程序员代码面试指南第二版 23.将单链表的每K个节点之间逆序

题目描述
给定一个单链表,实现一个调整单链表的函数,使得每 K 个节点之间的值逆序,如果最后不够 K 个节点一组,则不调整最后几个节点。

输入描述:
第一行一个整数 n,n 表示单链表的节点数量。

第二行 n 个整数 val 表示链表的各个节点的值。

第三行一个整数 K。

输出描述:
在给定的函数内返回链表的头指针。

示例1

输入
5
1 2 3 4 5
3

输出
3 2 1 4 5
第一次做; 核心:找好上一组的最后一个节点, 下一组的第一个节点, 当前组反转后的最后一个节点; 创建临时头结点
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        String[] str = sc.nextLine().split(" ");
        int k = Integer.parseInt(sc.nextLine());
        //input check
        if(n<1 || k<1)
            return;
        //创建链表
        ListNode head = new ListNode(Integer.parseInt(str[0]));
        ListNode curr = head;
        for(int i=1; i<n; i++){
            curr.next = new ListNode(Integer.parseInt(str[i]));
            curr = curr.next;
        }
        //execute
        //临时头结点
        ListNode temp = new ListNode(0);
        temp.next = head;
        //上一组的最后一个节点
        ListNode pre = temp;
        //下一组的第一个节点
        ListNode after = pre;
        curr = head;
        ListNode left = pre, right;
        //反转后当前组的最后一个节点
        ListNode last;
        int count = k;
        while(curr!=null){
            while(count > 0 && after != null){
                after = after.next;
                count--;
            }
            //如果after==null, 说明剩下的节点不够k个了
            if(after==null)
                break;
            //保存下一组的第一个节点
            after = after.next;
            //重置count
            count = k;
            //保存反转后的最后一个节点
            last = curr;
            //翻转当前的k个节点
            while(curr!=after){
                //save
                right = curr.next;
                //change
                curr.next = left;
                //update
                left = curr;
                curr = right;
            }
            //上一组的最后一个节点连接反转后的第一个节点
            pre.next = left;
            //反转后的最后一个节点连接下一组的第一个节点
            last.next = after;
            //update
            pre = last;
            after = last;
        }
        //打印结果
        curr = temp.next;
        while(curr!=null){
            System.out.print(curr.val+" ");
            curr = curr.next;
        }
    }
    public static class ListNode{
        int val;
        ListNode next;
        ListNode(int val){
            this.val = val;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤来实现链表建立: 1. 定义一个指向链表节点的指针p和一个中间节点的指针q,初始化p指向头节点,q指向NULL。 2. 依次遍历链表,每次将p节点链表中摘下,并将其插入到q节点之前。 3. 将q指向p,继续遍历链表,直到p指向NULL。 4. 将尾节点指向NULL,新的链表建立完成。 下面是建立链表的C语言实现代码: ```c #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; } // 建立链表 Node* reverseList(Node *head) { Node *p = head, *q = NULL; // 定义指针p和q while (p) { Node *next = p->next; // 记录p的下一个节点 p->next = q; // 将p摘下,并插入到q节点之前 q = p; // 将q指向p p = next; // 将p指向下一个节点 } return q; // 返回新的链表节点 } // 打印链表 void printList(Node *head) { Node *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { Node *head = createNode(1); head->next = createNode(2); head->next->next = createNode(3); head->next->next->next = createNode(4); printf("原链表:"); printList(head); head = reverseList(head); printf("链表:"); printList(head); return 0; } ``` 输出结果为: ``` 原链表:1 2 3 4 链表:4 3 2 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值