题目大意:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解法一:
思路:通过迭代将节点重组,前面的节点转移到重组链表的后面,实际上就是头结点的倒插操作。
遍历链表,迭代前节点prev,缓存当前节点current的下一节点,然后把当前节点的next指针指向前节点prev。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
current = head # 终止条件是current=NULL
prev = None
while current:
tmp = current.next
current.next = prev
prev = current
current = tmp
return prev
以下是Java版本:
解题:
采用最直接的思路,从链表的第二个节点开始向后遍历,将每一个遍历的节点插入作为当前的第一个节点,为了方便操作,我们定义一个fakeNode节点指向第一个节点,后面需要插入的节点需要做两件事:一,使需要插入的节点的next指向当前链表中的第一个节点(即fakeNode的下一个节点);二,让fakeNode的next指向需要插入的那个节点。经过这两个操作需要插入的节点就成为了当前链表的第一个节点。
代码:
public static ListNode reverseList(ListNode head) {
if(head==null||head.next==null)//0或一个节点的时候直接返回
return head;
ListNode fakeNode=new ListNode(-1);
fakeNode.next=head;
ListNode cur=head.next;//从第2个节点开始
head.next=null;//将第一个结点的next设为Null(反转之后第一个结点就是最后一个节点)
while(cur!=null)
{
ListNode nextcur=cur.next;
cur.next=fakeNode.next;
fakeNode.next=cur;
cur=nextcur;
}
return fakeNode.next;
}