题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
思路
反转链表最经典的办法莫过于头插法了。
但需要注意的是浅拷贝和深拷贝的区别。
对于基本数据类型而言,a=b,是直接将值复制一份,但对于引用数据类型而言,则是浅拷贝,即是对对象地址的复制,两者指向的仍是同一个对象。
浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。
深拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
实现深拷贝的两种方式:
①、让每个引用类型属性内部都重写clone() 方法
②、利用序列化
因为本题比较简单,所以如果用实现深拷贝的方式来写,则有点画蛇添足,因此,我们直接复制即可
代码
/**
* 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)
return head;//注意特判
ListNode ReHead =new ListNode();
ReHead.next=null;
ListNode i=new ListNode();
i.val=head.val;
i.next=head.next;
while(i!=null){
ListNode j=new ListNode();
j.val=i.val;
j.next=i.next;
//注意浅拷贝和深拷贝的区别
j.next=ReHead.next;
ReHead.next=j;
i=i.next;
}
return ReHead.next;
}
}```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608182008498.png)