链表倒置(C++&JAVA代码+思路)

链表倒置(C++&JAVA)


调整指针倒置链表(C++实现):

解题思路:
通过将所有结点的指针方向逆置来形成整个链表的逆置。
p1、p2和p3指针分别对应前中后三个位置的结点,其中p1初始为空,p2为头指针。

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
            if(pHead==NULL)return NULL;
        ListNode *p1=NULL;
        ListNode *p2=pHead;
        ListNode *p3=p2->next;
        while(p2!=NULL){
            p2->next=p1;
            p1=p2;
            p2=p3;
            p3=p3->next;
        }
        return p1;
    }
};


利用栈倒置链表(JAVA实现):
解题思路:
用栈先进后出的特性。
先将链表全部压入栈再弹出,就能得到新的逆置链表。

public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}
import java.util.Stack;
public class Solution {
    public ListNode ReverseList(ListNode head) {
    
        if(head==null)return null;
        Stack<ListNode> s=new Stack<>();
        
        while(head!=null){//原链表全部压入栈
            s.push(head);
            head=head.next;
        }
        
        ListNode n=s.pop();
        ListNode new_head=n;//逆置后链表的头节点

        while(!s.isEmpty()){//顺序出栈,再将元素连接成新的链表,isEmpty()防止报栈空Exception错误
            ListNode p=s.pop();
            n.next=p;
            p=n.next;
        }
        
        n.next=null;/*这一步很重要!!!
        必须设逆置后链表尾端元素的指针为空:
        原链表为1-2-3-null
        逆置后为3-2-1-null
        如果不设n.next=null,会变成3-2=1(尾端1原本指向2)
        */
        return new_head;    
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值