题目:输入一个链表,反转链表后,输出新链表的表头。

1 分析

  1. 假如链表的初始化状态如下图所示:
  1. 要将链表反转,只需要将链表中的指针反转,第一个链表的指针指向为 null的链表即可

  2. 定义三个指针 p1,p2,p3 其中p1执行为null的链表,p2,指向第一个链表,p3指向第2个链表;如下图所示;

4. 下面需要将p2指针指向p1
  1. 将p3的指针指向p2,依次执行,知道执行到最后一个链表即可

2. 代码实现如下图所示

public ListNode ReverseList(ListNode head) {
        if(head==null) return null;
        ListNode p1 = null;
        ListNode p2 = head;
        ListNode p3 = head.next;
        while(p2 != null){
            p2.next = p1;
            p1 = p2;
            p2 = p3;
            if(p3 != null ){
               p3 = p3.next;
            }
        }
        return p1;
    }  
  

判断一个链表是否有环

题目分析如下所示

代码实现

  
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null)return false;
        ListNode p1 = head;
        ListNode p2 = head;
        while(null != p1 && null != p1.next && null != p2 && null != p2.next){
            p2 = p2.next.next;
            p1 = p1.next;
            if(p1==p2){
                return true;
            } 
        }
        return false;
    }
}