标签:操作 while 一个 public 反转 取出 判断 描述 node
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
由于单向链表只能再单一方向上操作,且要进行增删改要辅助指针,所以我们这里可以通过增肌两个指针pre和cur,分别指向当前节点和当前节点的前一个节点,然后通过将当前节点的next指向pre,然后遍历即可,其中要再curNode.next指向preNode之前,暂存curNode的next节点。流程如下;
虽然是单链表的反转操作,我们可以通过将curNode节点,加载新的链表的第二个位置来实现反转;具体来说,就是依次取出原链表的节点,放在新的链表第二个位置,然后当链表遍历完成后,就形成了一个反向链表了。流程如下;
public ListNode reverseList2(ListNode head){ //创建两个指针一前一后 ListNode preNode = head; ListNode curNode = head.next; ListNode temp = null; //循环判断 while(true){ if(curNode == null){ break; } //保存curNode.next以供后面使用 temp = curNode.next; //curNode指向前面preNode curNode.next = preNode; //preNode和curNode后移 preNode = curNode; curNode =temp; } return preNode; }
class Solution { public ListNode reverseList(ListNode head) { ListNode newHead = new ListNode(0); ListNode curNode = head; ListNode temp = null; while(true){ if(curNode == null){ break; } //暂存curNode.next,供后面的后移使用, //因为下面要对curNode.next操作 temp = curNode.next; //让当前的节点直接newHead的next,相当于把newHead节点后面的接在了curNode后面, curNode.next = newHead.next; //然后再将curNode接在newHead后面即可 newHead.next = curNode; curNode = temp; } return newHead.next; } }
标签:操作 while 一个 public 反转 取出 判断 描述 node
原文地址:https://www.cnblogs.com/dazhu123/p/12490761.html