leetcode-反转链表

 
转载至:https://blog.csdn.net/fx677588/article/details/72357389
反转一个单链表。
 
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
迭代法:
首先对于链表设置两个指针,然后依次将旧链表上每一项添加在新链表的后面,然后新链表的头指针NewH移向新的链表头,如下图所示。此处需要注意,不可以上来立即将上图中P->next直接指向NewH,这样存放2的地址就会被丢弃,后续链表保存的数据也随之无法访问。而是应该设置一个临时指针tmp,先暂时指向P->next指向的地址空间,保存原链表后续数据。然后再让P->next指向NewH,最后P=tmp就可以取回原链表的数据了,所有循环访问也可以继续展开下去。
/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
class Solution {
    public ListNode reverseList(ListNode head) {
      if(head==null||head.next==null)return head;
        ListNode newH=null;
        ListNode p=head;
        while(p!=null){
            ListNode temp=p.next;    //暂存p下一个地址,防止变化指针指向后找不到后续的数
            p.next=newH;             //p->next指向前一个空间
            newH=p;                 //新链表的头移动到p,扩长一步链表
            p=temp;                 //p指向原始链表p指向的下一个空间
        }
        return newH;
    }
}
原文地址:https://www.cnblogs.com/patatoforsyj/p/9468956.html