一道简单的局部链表反转的问题,具体解决时的麻烦的分类

这道leetcode题,看起来是十分简单的

但解决过程中,分类有些问题

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n)
{
//
if(m==n)return head;
ListNode* iter;
ListNode *pre = new ListNode(0);
//头结点去除一般性
auto pre_s =pre;
pre->next = head;
iter = pre;
             for(int i=0;i<m-1;i++)
      pre = pre->next;
auto preNext=pre->next;
    for(int i=0;i<n;i++)
      iter=iter->next;
//刚好移到 tail Node pointer* 位
  if(iter->next!=NULL)
  {  
    auto iterNext = iter->next;
    rLink(preNext,iter);
     pre->next = iter;
    preNext->next = iterNext;
    return pre_s->next;
  }else{
    rLink(preNext,iter);
pre->next =iter;
preNext->next = NULL;
return pre_s->next;
}

}
void rLink(ListNode* start,ListNode* tail)
{
ListNode* s =start;
ListNode* g = s->next;
if(g==tail)
{
tail->next = start;
}
else{
ListNode* gnext = g->next;
//考虑特例情况
while(g!=tail)
{
g->next =s;
s = g;
g = gnext;
gnext = gnext->next;
}
g->next = s;
}
}
};

问题在这成立!//////////////

加了前置结点后,head结点被一般化后,返回一定要prehead->next;因为head节点的一般性导致他是有可能改变的,也会被反转

第二点,反转链表时如果不用二级指针是要用三个一级指针来实现的算法一定要熟悉

一般例子的驱动要记牢,跑一遍逻辑才会理通,刷题通理。

ListNode *reverseBetween(ListNode *head, int m, int n)

{ if(m==n)return head;

n-=m;

ListNode prehead(0);

prehead.next=head;

ListNode* pre=&prehead;

while(--m)pre=pre->next;

ListNode* pstart=pre->next;

while(n--)

{ ListNode *p=pstart->next;

pstart->next=p->next;

p->next=pre->next;

pre->next=p; }

return prehead.next; }

主要思想如下:找到这个点后使用cur和move把move头插到pre->next到cur这个链表中

实现了reverse局部链表。

思想主要时倒插,实现倒排序!

时间: 2024-11-10 06:37:35

一道简单的局部链表反转的问题,具体解决时的麻烦的分类的相关文章

单向链表反转,就地逆置与递归反转(无表头结点)

最近在看链表,今天刷到一道链表的反转题,链表反转可以说是基础操作,但是可提供的方案也有很多,简单通过了该题后又学习了一下递归反转,现在把三种方法都公开出来做一个总结. 1.就地逆置 2.单参数的递归逆置 3.双参数的递归逆置 一.就地逆置 方法:头插. 由于这里是不带表头结点的单向链表,所以头插会稍微复杂一点,不想往下看的小伙伴也可以直接选择定义一个临时表头结点从头结点开始遍历链表将每一个链表头插,最后将头结点指向表头结点的next指针域,最后free掉那个表头结点即可. 虽然不带表头结点头插会

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾

链表反转leetcode206

最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的多了再用C++总是忘记敲分号和括号,甚至Compile Error了几次 = =.尴尬 链表反转比较简单,首先用自己的"本科"方法做了一下,发现效率并不高: 1 class Solution { 2 public: 3 ListNode* reverseList(ListNode* hea

c语言:建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据

建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据. 解:将第1个结点的起始地址赋给头指针head,将第2个结点的起始地址赋给第1个结点的next成员,将第3个结点的起始地址赋给第2个结点的next成员.第3个结点的next成员赋予NULL,这就形成了链表.为了建立链表,使head指向a结点,a.next指向b结点,b.next指向c结点,c.next=NULL的作用是使c.next不指向任何有用的存储单元. 程序: #include<stdio.h> struct Stud

单链表反转问题

单链表反转问题 基本问题 如何将单链表反转? 算法实现 /** * * Description: 单链表反转. * * @param head * @return ListNode */ public static ListNode reverseList(ListNode head) { if (head == null) { return head; } ListNode prev = null; ListNode current = head; ListNode next = null;

链表反转的递归和非递归实现方式

链表反转是数据结构的基本功,主要有递归和非递归两种实现方式.我们一一介绍如下: 1. 非递归实现 主要包括如下4步: 1)如果head为空,或者只有head这一个节点,return head即可: 2)从头到尾遍历链表,把reversedHead赋值给当前节点的next: 3)当前节点赋值给reversedHead: 4)遍历结束,return reversedHead. 下图试图来辅助说明: 代码如下: node* reverseList(node* head) { if(head == NU

链表反转(递归方式,非递归方式)

//非递归方式进行链表反转 public ListNode reverseList(ListNode head){ if(head==null||head.next==null){ return head; }else { ListNode pre=head; ListNode p=head.next; ListNode next=null; while (p!=null) { next=p.next; p.next=pre; pre=p; p=next; } head.next=null; r

单链表反转的2种方法

1 public class ReverseDemo { 2 3 /** 4 * 单链表反转的两种方法 5 */ 6 public static void main(String[] args) { 7 Node head =new Node("a"); 8 Node node2=new Node("b"); 9 Node node3=new Node("c"); 10 head.setNext(node2); 11 node2.setNext(

链表 单链表反转

思路1:O(n^2). “狸猫换太子”,不进行改动链表结构,只首尾交换len/2次.但是在本函数中用到了定位函数,定位函数实际上是遍历了一遍整个链表,所以综合效率很低,达到O(n^2). //单链表反转(O(n^2)) void reverseList(Node* Head) { int count = numOfNodes(Head); //首尾交换 for(int i=1; i<=count/2; i++) { Node* p1 = locateNodeI(Head, i); Node* p