链表
题目:输入一个链表,反转链表后,输出新链表的表头。
1 分析
- 假如链表的初始化状态如下图所示:
要将链表反转,只需要将链表中的指针反转,第一个链表的指针指向为 null的链表即可
定义三个指针 p1,p2,p3 其中p1执行为null的链表,p2,指向第一个链表,p3指向第2个链表;如下图所示;
- 将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;
}
}
- 上一篇: 常见算法的实现
- 下一篇: 最长子序列问题解决思路