本文共 1494 字,大约阅读时间需要 4 分钟。
反转一个单链表。
示例:
输入: 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 = Noneclass 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; }
转载地址:http://asuvi.baihongyu.com/