Java链表常见操作【剑指Offer】03:从尾到头打印链表

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

题解一:递归
 1 /*
 2   在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(listNode.val)这个操作,
 3  从最后一次到第一次,逆向的调用了后面的方法
 4   */
 5         static ArrayList<Integer> list = new ArrayList<>();
 6         public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
 7             if (listNode != null) {
 8                 printListFromTailToHead(listNode.next);
 9                 list.add(listNode.val);
10             }
11             return list;
12         }
题解二:reverse()方法
1 public static ArrayList<Integer> printListFromTailToHead01(ListNode listNode) {
2         ArrayList<Integer> list = new ArrayList<Integer>();
3         while(listNode != null){
4             list.add(listNode.val);
5             listNode = listNode.next;
6         }
7         Collections.reverse(list);//使用Collections的reverse方法,直接将list反转
8         return list;
9     }

节点结构定义

public static class ListNode {
        int val;
        ListNode next = null;
        ListNode(int val) {
            this.val = val;
        }
    }

从头插入节点

1  public static void insetFromHead(ListNode head,ListNode newNode){
2             newNode.next=head;
3             head = newNode;
4         }

在尾部插入节点

 1 public static void insertFromTail(ListNode head, ListNode newNode){
 2             //如果是个空链表,直接把新节点赋值给head,然后结束,要先判断null的情况
 3             if(head == null){
 4                 head =newNode;
 5                 return;
 6             }
 7         //用temp代替head去遍历找到最后一个节点,一定不要用head自己去遍历,
 8             ListNode temp = head;
 9             while (temp.next!=null){
10                 temp=temp.next;
11             }
12             temp.next=newNode;
13         }

计算链表的长度

1  public  static int length(ListNode head){
2             int len =0;
3             ListNode temp = head;
4             while(temp!=null){
5                 len++;
6                 temp=temp.next;
7             }
8             return len;
9         }

按照顺序输出一个列表

1  public static void printList(ListNode head){
2             ListNode temp = head;
3             while(temp != null){
4                 System.out.print(temp.val+" ");
5                 temp = temp.next;
6             }
7             System.out.println();
8         }

从特定位置删除一个节点

 1 public static boolean deleteFromIndex(ListNode head,int index){
 2             if(index<1||index>length(head)){ //先判断是否越界
 3                 return false;
 4             }
 5             if(index ==1){//如果是删除第一个元素,因为直接涉及到了head所以只能单独处理
 6                 head = head.next;
 7                 return true;
 8             }
 9             ListNode curNode = head;
10             //删除顺序为index的node只能将curNode停在index-1的位置
11             for(int curIndex =1;curIndex<index-1;curIndex++){
12                 curNode = curNode.next;
13             }
14             curNode.next=curNode.next.next;
15             return true;
16         }

测试:

 1 public static void main(String[] args) {
 2         Scanner sc = new Scanner(System.in);
 3         int nums = sc.nextInt();
 4         ListNode headNode = new ListNode(1);
 5         for(int i=2;i<=nums;i++){
 6             insertFromTail(headNode,new ListNode(i));
 7         }
 8         printList(headNode);
 9         ArrayList<Integer> list = printListFromTailToHead01(headNode);
10         System.out.println(list);
11         ArrayList<Integer> list1 = printListFromTailToHead(headNode);
12         System.out.println(list1);
13         deleteFromIndex(headNode,3);
14         printList(headNode);
15         int length = length(headNode);
16         System.out.println(length);
17     }

输入:8
输出:
1 2 3 4 5 6 7 8
[8, 7, 6, 5, 4, 3, 2, 1]
[8, 7, 6, 5, 4, 3, 2, 1]
1 2 4 5 6 7 8
7

原文地址:https://www.cnblogs.com/Blog-cpc/p/12336153.html

时间: 2024-10-07 20:13:19

Java链表常见操作【剑指Offer】03:从尾到头打印链表的相关文章

剑指offer(6)——从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 思路分析: 方法一:利用栈的先进后出思想实现,加上判断条件后17ms,刚开始24ms class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { // 1.判断链表为空或为1 // 判断链表为空的情况 if (listNode == null) { return new ArrayList<Integer>

剑指offer系列——从尾到头打印链表

Q:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T: 1.我直接用的reverse函数.这道题需要注意的,就是链表为空的情况.不过--应该<数据结构>里经常提到了. # include <algorithm> vector<int> printListFromTailToHead(ListNode* head) { vector<int> Array

剑指Offer之从尾到头打印链表

这题有两种思考方式,一种是添加辅助空间,先进后出,当然是栈了,做法就是遍历链表,将值压入栈中,然后再一次弹出.还有一种方法是链表反序,链表反序也有两种方法.一种是将链表在原有的基础上更改指针,进行反序.光看代码可能不太还理解,我们可以看一下执行过程. 假设p1->p2->p3->p4->p5->p5->.......那么执行一次为p1<-p2->p3->p4->p5.......然后p1=p2;p2=p3;将其更新为新的p1->p2->

【剑指offer】从尾到头打印链表

我的思路:先翻转链表,再打印. 网上思路:利用栈的后进先出性质:或者用递归,本质也是栈. 我的代码: #include <vector> using namespace std; struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: vector<int> printListFromTailToHead

牛客网-《剑指offer》-从尾到头打印链表

C++ 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * ListNode(int x) : 6 * val(x), next(NULL) { 7 * } 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> printListFromTailToHead(struct ListNode* head) { 13 vector<int&

03 从尾到头打印链表

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ListNode cur = listNode; ArrayList<Integer> list = new ArrayList<>(); if(cur == n

剑指offer——03从尾至头打印列表(Python3)

思路:相当于数据结构中的链表就地逆置,可以使用头插法来实现. 代码: class Solution:     # 返回从尾部到头部的列表值序列,例如[1,2,3]     def printListFromTailToHead(self, listNode):         # write code here         l = []         head = listNode         while head:             l.insert(0, head.val)

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

【剑指offer】Q5:从尾到头打印链表

可以练习下链表的逆置. def PrintListReversingly(head): if head == None: return if head: PrintListReversingly(head.next) print head.val def reverse(head): if head == None or head.next == None: return head psuhead = ListNode(-1) while head: nexthead = head.next h