描述:

(1)翻转一个链表

样例

给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null

**************************************************************************

(2)将两个排序链表合并为一个新的排序链表

样例

给出 1->3->8->11->15->null2->null, 返回 1->2->3->8->11->15->null

解题思路:

已经定义好ListNode链表类,翻转可以采用栈(stack)来进行读取,也可以采用三个指针来变换,还可以采用递归的方式。

排序就要用到两个指针,头指针和尾指针,尾指针进行数据的指引操作,最后返回头指针即可,也可以采用递归的方式。

代码如下:

import java.util.Stack;

public class 翻转链表 {
/**
* Definition for ListNode.
*/
public class ListNode {
int val;
ListNode next; ListNode(int val) {
this.val = val;
this.next = null;
}
} /*
* @param head: n
*
* @return: The new head of reversed linked list.
*/
public ListNode reverse(ListNode head) {
// write your code here
if (head == null)
return null;
ListNode reverseHead = new ListNode(0);
ListNode current = reverseHead;
Stack<ListNode> st = new Stack<ListNode>();//定义栈
while (head != null) {
st.push(head); //压入栈中
head = head.next;
}
while (!st.empty()) {
current.next = st.pop(); //取出节点
current = current.next;
}
current.next = null;
return reverseHead.next;
} /**
* @param head: The head of linked list.
* @return: The new head of reversed linked list.
*/
public ListNode reverse2(ListNode head) {
// write your code here
ListNode revHead = null;
ListNode prev = null;
while(head!=null){
ListNode pNext = head.next;
if(pNext == null){
// 翻转后的头节点,后面是空,结果
revHead = head;
}
// head的下一个节点指向之前要链接的节点
head.next = prev;
// 要链接的节点 直线p节点,以供下次链接
prev = head;
// head节点更新,指向pNext
head = pNext;
}
return revHead;
} /**
* 递归
* @param head
* @return
*/
public ListNode reverse3(ListNode head) {
// write your code here
if( head ==null || head.next ==null)
return head;
ListNode second = head.next;
head.next = null;
ListNode res = reverse(second);
second.next = head;
return res;
}
}
public class 合并两个排序链表 {
/**
* Definition for ListNode.
*/
public class ListNode {
int val;
ListNode next; ListNode(int val) {
this.val = val;
this.next = null;
}
} /**
* @param ListNode
* l1 is the head of the linked list
* @param ListNode
* l2 is the head of the linked list
* @return: ListNode head of linked list
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// write your code here
if (l1 == null && l2 != null)
return l2;
if (l1 != null && l2 == null)
return l1;
if (l1 == null && l2 == null)
return null;
ListNode head = new ListNode(0); //头指针
ListNode current = head; //尾指针
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
current.next = l1;
current = current.next;
l1 = l1.next;
} else {
current.next = l2;
current = current.next;
l2 = l2.next;
}
} if (l1 != null)
current.next = l1;
if (l2 != null)
current.next = l2;
return head.next;
} /**
* 递归方法
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
// write your code here
if(l1==null && l2!=null)
return l2;
if(l1!=null && l2==null)
return l1;
if(l1==null && l2==null)
return null;
ListNode MergeHead = null;
if(l1.val < l2.val){
MergeHead = l1;
MergeHead.next = mergeTwoLists(l1.next,l2);
}else{
MergeHead = l2;
MergeHead.next = mergeTwoLists(l1,l2.next);
}
return MergeHead; } }

LintCode:链表操作(合并与反转)的更多相关文章

  1. C/C++链表操作(面试)

    1.为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3 ...

  2. bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1818  Solved: 761[Submit][Status ...

  3. linux内核里的字符串转换 ,链表操作常用函数(转)

    1.对双向链表的具体操作如下: list_add ———向链表添加一个条目 list_add_tail ———添加一个条目到链表尾部 __list_del_entry ———从链表中删除相应的条目 l ...

  4. C#的链表操作[数据结构-线性表]

    链式存储结构图解: 上图中,a1,是数据,紧跟着后面的d1是下一个节点的地址值.也就是一个节点的最后存储的是下一个节点的地址值,最后一个节点的存储的下一个地址值是null,代表链表结束. 1,定义链表 ...

  5. linux 内核的链表操作(好文不得不转)

    以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见. 本文详细分析了 2.6.x 内 ...

  6. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  7. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

  8. YTU 2620: B 链表操作

    2620: B 链表操作 时间限制: 1 Sec  内存限制: 128 MB 提交: 418  解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...

  9. C# 链表操作

    关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...

  10. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

随机推荐

  1. (三)Thymeleaf标准表达式之——文字(literals)

    2.2 文字(literals) 模板名称:text.html 2.2.1 文本(text literals)(放在 单引号 里面,可以是任意字符) <p> Now you are loo ...

  2. hdu5399

    题意:给你m行个长度为 n的序列或者-1 -1代表这一行的序列不确定,然后让你找出有多少种情况满足对于每一个i 有f1(f2(⋯fm(i)))=i: 思路:分为三种情况:1,每行序列中有反复数输出0: ...

  3. elasticsearch报错syncedb_path

    一般默认syncdb_path在$HOME目录下隐藏文件,也可以自己指定一个文件,记住,这里只能指定文件,不能只写目录input { file { path => "/home/tom ...

  4. java 安装后 不能 java javac 说找不到命令 -bash: javac: command not found

    java 安装后 不能 java javac  说找不到命令 -bash: javac: command not found 不是环境变量的问题, 直接cd到java的目录 也不能执行命令 后来发现是 ...

  5. JavaScript 中的命名空间

    全局变量应该由有系统范围相关性的对象们保留,并且它们的命名应该避免含糊并尽量减少命名冲突的风险.在实践中,这意味着你应该避免创建全局对象,除非它们是绝对必须的. 所以你对此是怎么做的?传统方法告诉我们 ...

  6. jquery的on()

    定义和用法 on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方法的新的替代品 ...

  7. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  8. centos6.5安装Apache+MySQL+PHP

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  9. shiro自定义拦截url

    在实际项目上,我们针对不同的用户(guste,user,admin,mobile user)等等,需要进入不同的页面,比如,手机端用户需要进入Mobile/这个路径下的,这个时候,我们需要自定义拦截u ...

  10. vue+mousemove实现拖动,鼠标移动过快拖动就失效

    今天用vue+原生js的mousemove事件,写了个拖动,发现只能慢慢拖动才行,鼠标只要移动快了,就失效,不能拖动了: 搞了半天在,总算解决了,但是问题的深层原理还没搞清楚,知道的大侠可以留言分享, ...