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; } }