【腾讯面试-链表】根据链表中的某个节点反转链表

1.问题描述

给定无序链表和一整数K,假设链表为1->2->3->4->5->6>7,K=4,
那么返回以K为中心两边都反转的链表,应该为5->6>7->4->3->2->1


2.解决方案

1.先按反转链表走,走到4的时候停下来,这时已经得到了链表4->3->2->1,并且记录5这个节点
2.从5开始遍历到7,这时候把7->next=4,这样5->6>7->4->3->2->1,就形成了
3.实现起来稍微有一点难度吧,比如传指针要传引用,反转时别忘了分析边界情况等

#include <iostream>
using namespace std;

class Node{
public:
    int val;
    Node* next;
    Node(){}
    Node(int val,Node * next){
        this->val=val;
        this->next=next;
    }
};

Node* method(Node*& head,int k){
    Node* p1= nullptr;
    Node* p2=head;
    while(p2->val!=k){
        Node* t=p2->next;
        p2->next=p1;
        p1=p2;
        p2=t;
    }
    //很重要记录K值的后一个节点
    head=p2->next;
    //反转K这个节点,这个千万注意分析边界值,否则会忘了这个反转
    p2->next=p1;
    return p2;
}


int main() {
    Node* head=new Node(1,new Node(2,new Node(3,new Node(4, new Node(5,new Node(6, nullptr))))));
    Node* t=method(head,4);
	
	//遍历找到7,并且7->next=4
    Node* head1=head;
    while(head1->next!= nullptr){
        head1=head1->next;
    }
    head1->next=t;

	//遍历输出链表
    while(head!= nullptr){
        cout<<head->val<<" ";
        head=head->next;
    }
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值