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->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
这一题的主要就是链表的逆序,逆序比较好的解法有前插,利用栈,这里我们使用前插的方式解决
先看代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head==null||m==n) return head; ListNode dummy=new ListNode(0); dummy.next=head; ListNode mPre=dummy; ListNode mNode=head; int i=1; while(i<m){ mPre=mPre.next; mNode=mNode.next; i++; } while(i<n){//前插 ListNode temp=mPre.next; mPre.next=mNode.next; mNode.next=mNode.next.next; mPre.next.next=temp; i++; } return dummy.next; } }
首先需要找到m节点和m节点的前节点。
找到m节点和其前节点后我们就可以进行前插了。
ListNode temp=mPre.next;//现将mPre的后面一个节点保存起来。插入的时候就是讲其他节点插入mPre和mPre后面一个节点之间,所以要保存mPre的后一个节点
mPre.next=mNode.next;//mNode.next指向要插入的节点。将此节点作为mPre的next节点
mNode.next=mNode.next.next;//mNode的next指针指向他的下下个节点
mPre.next.next=temp;//将插入节点的next指针指向我们之前保存的节点。完成节点的插入
相关推荐
`Reverse`方法则需要两个指针,一个记录当前节点,另一个记录前一个节点,依次交换节点的`Next`指针,直到遍历完整个链表。 项目的实现细节可能包含异常处理,如确保插入和删除操作时不会超出链表范围,或者在空...
2. 反转链表(Reverse Linked List) 反转链表是将链表的方向反转,即将链表的头节点变为尾节点,尾节点变为头节点。这种操作可以用于解决一些特殊的问题,例如,反转链表以满足某些算法的要求。 知识点:反转链表...
进行一次遍历,把第m到n个元素进行翻转,即依次插入到第m个节点的头部。这个题还是有意思的。建议后面再多做几遍。Python代码如下:self.next = No
总的来说,单链表的逆序输出是一个很好的练习,可以帮助我们加深对数据结构和算法的理解,特别是对于链表操作和指针操作的掌握。在实际的软件开发中,熟练掌握这类基础操作可以提升代码的效率和质量。
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→...
C#,递归方法实现双向链表(Doubly Linked List)的反转(Reverse)算法与源代码 递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的...
Linked List Cycle II**:找到链表环的长度,并给出进入环的第一个节点。 4. **解决链表问题的策略** - **迭代法**:使用循环遍历链表,通常适用于大多数链表操作。 - **递归法**:对于某些特定问题,如链表反转...
### 链表操作(创建、排序、插入、逆序递归) 在计算机科学中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和其他节点的链接。链表的操作通常包括创建、排序、插入等。下面将详细介绍这些操作在...
第92题“反转链表II”(Reverse Linked List II)要求对链表的一部分进行反转。具体来说,给定一个链表的头节点`head`、一个整数`m`和一个整数`n`,你需要反转从位置`m`到位置`n`的链表部分,其中位置`1`为链表的...
LeetCode 206的题目是“反转链表”(Reverse Linked List),它要求将一个单链表的所有节点反转,并返回反转后链表的头节点。这是一个基础但非常重要的链表操作问题,它不仅考察了对链表数据结构的理解,还涉及到了...
DoublyLinkedList() : head(nullptr), tail(nullptr) {} // 插入节点 void insert(int value, Node* prevNode); // 删除节点 void remove(Node* node); // 遍历链表 void traverse(); // 反转链表 void...
在计算机科学中,双向链表(Double-Linked List)是一种数据结构,它允许在列表中的元素之间进行前向和后向导航。与单链表不同,双向链表的每个节点包含两个指针,一个指向其前一个节点,另一个指向其后一个节点。...
VC中的双向链表模板类`DoublyLinkedList<T>`可能包含以下结构: 1. **节点定义**:与单向链表类似,但需要增加一个指向前一个节点的指针,如`ListNode* prev`。 2. **链表类定义**:除了单向链表的基本方法外,还会...
本文将深入探讨链表的几个关键操作:链表反转、合并有序列表、新增节点、删除节点、判断链表是否有环以及找到链表的中间节点。我们将使用Java语言进行讨论。 首先,链表不同于数组,它不依赖于内存中的连续空间。每...
4. 链表环检测 II(Linked List Cycle II, 如LeetCode的第142题):找到链表环内的起点。 5. K 个一组翻转链表(Reverse Nodes in K-Group, 如LeetCode的第25题):将链表中的节点每K个一组进行反转。 解决这些题目...
public class DoublyLinkedList { private Node head; private Node tail; // 添加节点到链表尾部 public void addNode(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; ...
一个示例代码,演示了如何在PTA中实现逆序数据建立链表的过程。...调用 build_reverse_linked_list 函数构建逆序链表。 最后调用 print_linked_list 函数打印链表元素。 示例输入输出: 假设输入为: 5 1 2 3 4 5
### C语言链表定义及其基本操作 #### 链表定义 链表是一种常见的线性数据结构,由一系列结点组成。每个结点包括两个部分: - 数据域:用于存储实际的数据元素。 - 指针域:用于存储指向下一个结点的地址。 在C语言...
链表的其他变种还包括双向链表(Doubly Linked List),它同时具有前驱和后继指针,允许双向遍历,提高了数据访问的灵活性。还有循环链表(Circular LinkedList),其中最后一个节点的指针会指向头节点,形成一个...
class DoublyLinkedList: def __init__(self): self.head = None self.tail = None # 插入节点 def insert(self, data, index=None): # ... 实现插入逻辑 ... # 删除节点 def remove(self, value): # ......