Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74082
  • 博文数量: 16
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 187
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 19:58
个人简介

一步一个阶梯,向人类进化。

文章分类

全部博文(16)

文章存档

2018年(1)

2015年(3)

2014年(11)

2013年(1)

我的朋友

分类: Java

2015-01-05 16:46:15

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
比把整个单链表反序复杂一点,实际上只需要考虑几种特殊情况,即m和n是否位于边界。如果m=1,n=length,那么就是普通的单链表反序;否则,需要保存m的前一个节点和n的后一个节点,方便和反序好的中间部分连接起来。
单链表反序的基本思想无非就是设置两个指针p1和p2:


先将两个指针反序,即p2指向p1,然后p1和p2后移一位:

当p2移到null的时候,反序完成。此题为部分反序,在这种思路的基础上加入一些边界条件即可。

点击(此处)折叠或打开

  1. public class Solution {
  2.     public ListNode reverseBetween(ListNode head, int m, int n) {
  3.         if(head.next == null){
  4.             return head;
  5.         }
  6.         int length = n - m;
  7.         ListNode rev_Head = head;
  8.         ListNode start = head;
  9.         ListNode rev_End = null;
  10.         if(m != 1){
  11.             for(int i = 0; i < m - 2;i ++){
  12.                 rev_Head = rev_Head.next;
  13.             }
  14.             start = rev_Head.next;
  15.         }
  16.         ListNode p1 = start;
  17.         ListNode p2 = start.next;
  18.         int pos = 0;
  19.         ListNode temp = null;
  20.         while(pos < length){
  21.             temp = p2.next;
  22.             p2.next = p1;
  23.             p1 = p2;
  24.             p2 = temp;
  25.             pos ++;
  26.         }
  27.         start.next = p2;
  28.         if(m == 1){
  29.             head = p1;
  30.         }else{
  31.             rev_Head.next = p1;
  32.         }
  33.         return head;
  34.     }
  35. }


阅读(1529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~