目 录
描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
解题思路:
有较多解法,
- 定义三个指针,整体右移,边移动,边翻转,保证不会断链。
- 可以采用头插思想进行翻转
- 方法一:三指针
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
//不带头结点,至少有2个节点
ListNode first = head; //指向第一个节点
ListNode second = first.next; //指向第二个节点
ListNode third = second.next;//指向第三个节点,可能为null
while(third != null){
//翻转
second.next = first;
//指针整体后移
first = second;
second = third;
third = third.next;
}
second.next = first;//当传入的链表只有两个节点 or 上述翻转结束时,最后一个节点并未翻转
head.next = null;//曾经的第一个节点,next并不是null,设置一下
head = second; //头指针指向最后一个节点
return head;
}
}
- 方法二:头插法
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode new_head = null;
while(head != null){
//先从原链表中去掉第一个节点
ListNode p = head;
head = head.next;
//再将p标识的节点头查到新链表
p.next = new_head;
new_head = p;
}
head = new_head;
return head;
}
}