题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点的定义如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
思路:定义first指针指向原链表中待反转的节点,second指针指向待反转节点的下一个节点,以保证待反转节点反转后找不到原链表的后续节点,再定义reverse指针指向反转后链表的头节点。
代码(已在牛客网AC):
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode first, second, reverse;
first = head;
second = head.next;
reverse = null;
while(first != null)
{
second = first.next;
first.next = reverse;
reverse = first;
first = second;
}
return reverse;
}
//递归实现
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode second = head.next;
ListNode rest = ReverseList(second);
second.next = head;
head.next = null;
return rest;
}