剑指offer面试题24:反转链表-java

来源:互联网 发布:淘宝旧杂志回收 编辑:程序博客网 时间:2024/06/11 20:53

题目:定义一个方法 输入一个链表的头节点,反转该链表并输出反转后链表的头节点
为了正确反转一个链表,需要调整链表每个节点对下一个节点的指向。
思路:
(1)把当前节点的下一个节点保存起来
当前节点的next指向它前一个节点之前要把它的后一个节点保存起来。因为后一个节点只能通过当前节点的next找到,如果不提前保存起来,当前节点的next指向它的前一个节点后,它后面的节点将失去引用找不到了。
(2)判断是否达到尾节点
若果当前节点的下一个节点是空的话 那么当前节点就是链表的尾节点 也就是反转后链表的头节点。
(3)当前节点的next指向当前节点的前一个节点(实现当前节点指向反转)
(4)将当前节点的前一个节点和当前节点都后移

非递归方法:

public class ReverseList {    //反转链表,    public static ListNode reverseList(ListNode pHead){        ListNode pReverseHead = null;        ListNode pNode = pHead;        ListNode pPrev = null;        while (pNode!=null){            ListNode pNext = pNode.next;            //如果第二个节点为空,那么该节点就是头结点            if (pNext == null){ pReverseHead = pNode; }            pNode.next = pPrev;            //整体链表往后移动            pPrev = pNode;            pNode = pNext;        }        return pReverseHead;    }    public static void main(String[] args){        ListNode a = new ListNode(1);        ListNode b = new ListNode(2);        ListNode c = new ListNode(3);        a.next = b;        b.next = c;        ListNode head = reverseList(a);        while (head!=null){            System.out.print(head.val+ " ");            head= head.next;        }    }}

递归方法:

public ListNode Reverse(ListNode head) {      if (head == null || head.next == null) {          return head;      }      ListNode secondElem = head.next;      head.next = null;      ListNode reverseRest = Reverse(secondElem);      secondElem.next = head;      return reverseRest;  } 
阅读全文
0 0
原创粉丝点击