前言有一个链表,如何对其进行反转,得到反转后的链表头节点?本文将分享一个解决方案,欢迎感兴趣的开发者阅读本文。思路分析学过数据结构基础知识后,我们知道链表中的每个节点都会有一个指针指向它的下一个节点。那么,我们只需要从链表的头部开始遍历,将它的指针一一修改为它的下一个结点。前一个节点可以完成链表的反转。这个思路的难点在于如何调整指针的指向。我们可以使用三个指针来完成这个操作,如下所示:p1和p3分别是p2指针的前一个节点和下一个节点(默认指向null)。如果p2指针指向的节点不为null则获取p2指针指向的下一个节点,保存到p3中。如果p3的值为null,说明链表已经反转。用一个变量存储p2的值并修改p2指针指向p1,修改p1的值为p2,p2的值改为p3,实现代码。通过上面的分析,我们分析出了可以用三指针来解决问题的思路。接下来我们看一下代码实现。首先,设计一个名为ReverseLinkedList的类:里面有2个私有变量。pPrevp1指针pNodep2指针构造方法接受一个参数:链表的头节点。检查参数。初始化p2指针指向链表的头节点,p1指针指向null。exportclassReverseLinkedList{//p1指针privatepPrev:ListNode|无效的;//p2指针privatepNode:ListNode|无效的;constructor(listHead:ListNode){if(listHead==null){thrownewError("链表头节点不能为空");}this.pNode=listHead;this.pPrev=null;在上面的代码中,我们使用了一个自定义类型ListNode,它描述了一个链表节点应该包含哪些属性。对此感兴趣的开发者,请移步我的另一篇文章:链表与伪装链表的实现。接下来实现链表的反向功能:声明一个变量存放反向链表头指针。移动p2指针,开始遍历链表。将p2指针的下一个节点存储到p3。判断p2指针是否在链表末尾,如果满足则修改p2节点并存入反向链表头指针变量。修改p2的指针为p1,修改p1的值为p2,修改p2的值为p3。p2指针指向null,返回得到的链表的头节点。反向列表():列表节点|null{//反转列表头指针letpReversedHead:ListNode|空=空;while(this.pNode!=null){//p3指针constpNext=this.pNode.next;如果(pNext==null){pReversedHead=this.pNode;}this.pNode.next=this.pPrev;this.pPrev=this.pNode;这个.pNode=pNext;}返回pReversedHead;.tstestcase下面我们将前言中的例子代入到上一章实现的函数中,验证是否能得到正确的结果。constlinkedList=newLinkedList();linkedList.push(1);linkedList.push(3);linkedList.push(8);linkedList.push(9);linkedList.push(12);linkedList.push(18);constreverseLinkedList=newReverseLinkedList(linkedList.getHead());constresult=reverseLinkedList.reverseList();console.log("反向链表的头节点为",result);运行结果如下,成功解决了文章前言中提到的问题。完整代码请移步:reverseLinkedList-test.ts示例代码:本文所列代码,完整版请移步
